使用可选参数和默认参数
可选参数又称默认参数
[修饰符] 返回类型 方法名 (参数1…参数n,可选参数1…可选参数n)
其中,必选参数一定会在可选参数的前面,而且在方法调用的时候必须要给参数,否则会发生编译报错。
#region bage
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
using static System.Convert;
#endregion
namespace Test
{
class Program
{
public static void add( int num1,int num2 = 10)
{
WriteLine(num1+num2);
}
static void Main(string[] args)
{
Program.add(30,50);
ReadKey();
}
}
}
命名参数
调用方法时指定参数名称
语法如下:
方法名(参数一名:参数一值…参数n名:参数n值)
示例如下:
#region bage
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
using static System.Convert;
#endregion
namespace Test
{
class Program
{
public static void add( int num1,int num2)
{
WriteLine(num1);
WriteLine(num2);
}
static void Main(string[] args)
{
Program.add(num2:30,num1:50);
ReadKey();
}
}
}
了解隐式类型、匿名类型和dynamic类型
隐式类型
- 编译器推断类型
var 变量名 = 变量值
在声明时必须同时赋值,相当于在赋值之后var才知道自己代表的是什么类型。
例子如下:
#region page
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
#endregion
namespace Test
{
class Program
{
static void Main(string[] args)
{
var i = "string";
Console.WriteLine(i);
Console.ReadLine();
}
public static void add(int num1,int num2)
{
Console.WriteLine(num1);
Console.WriteLine(num2);
}
}
}
匿名类型
语法:
new{属性1名:属性1值,…属性n名:属性n值}
不需要指定属性类型
例子如下:
namespace Test
{
class Program
{
static void Main(string[] args)
{
//var i = "string";
//Console.WriteLine(i);
var tmp = new { id = 123,name ="张三"};
//除了类型名称和无法修改值以外,其他的操作方法和类的操作方法一样
Console.WriteLine(tmp.id);
Console.WriteLine(tmp.name);
//一般用在数据传递和路由
Console.ReadLine();
}
}
}
匿名类型一般用在数据传递和路由
除了没有类型名称也无法修改值以外,其他操作方法和类的操作方法相同
里面给定的参数值相同于常量,无法更改。
dynamic类型
- 在运行时做类型检查(动态类型)
- 可用于变量类型,方法参数和返回值类型
例子如下:
#region page
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
#endregion
namespace Test
{
class Program
{
static void Main(string[] args)
{
//var i = "string";
//Console.WriteLine(i);
// var tmp = new { id = 123,name ="张三"};
//除了类型名称和无法修改值以外,其他的操作方法和类的操作方法一样
//Console.WriteLine(tmp.id);
//Console.WriteLine(tmp.name);
//一般用在数据传递和路由
dynamic d = "string";
Console.WriteLine(d);
Console.WriteLine(d + 30);
d = 123;
Console.WriteLine(d);
Console.WriteLine(d+30);
//是运行时决定
object obj = 123;
Console.WriteLine(Convert.ToInt32(obj) +30);
Console.ReadLine();
}
}
}
动态类型,在运行时决定类型,无论初始赋值给的是什么都不会报编译错误,而在使用的时候相对于同样能储存任何类型的object类型则不需要数据类型的显式和隐式转换。
虽然很好用,但是程序每在调用一次定义的动态类型都会给这个参数做一次类型验证,会增加系统的性能负担。只用在自己不知道应该是什么类型的参数时才能使用。
掌握可空类型的用法
可空类型
- 可空类型允许值类型设置为空值(null)
- 针对数值类型
语法如下:
System.Nullable<类型> 变量名
类型?变量名
例子如下:
#region page
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
#endregion
namespace Test
{
class Program
{
//public static void add(int num1,int num2)
//{
// Console.WriteLine(num1);
// Console.WriteLine(num2);
//}
static void Main(string[] args)
{
//var i = "string";
//Console.WriteLine(i);
// var tmp = new { id = 123,name ="张三"};
//除了类型名称和无法修改值以外,其他的操作方法和类的操作方法一样
//Console.WriteLine(tmp.id);
//Console.WriteLine(tmp.name);
//一般用在数据传递和路由
//dynamic d = "string";
//Console.WriteLine(d);
//Console.WriteLine(d + 30);
//d = 123;
//Console.WriteLine(d);
//Console.WriteLine(d+30);
//是运行时决定
int ? i = 9 ;
int j = (int)i;
Console.WriteLine(i+j);
Console.ReadLine();
}
}
}
一个?代表是将问号后的变量名所表示的变量变成可空类型,而两个??表示加了个默认值。
例子如下:
#region page
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
#endregion
namespace Test
{
class Program
{
//public static void add(int num1,int num2)
//{
// Console.WriteLine(num1);
// Console.WriteLine(num2);
//}
static void Main(string[] args)
{
//var i = "string";
//Console.WriteLine(i);
// var tmp = new { id = 123,name ="张三"};
//除了类型名称和无法修改值以外,其他的操作方法和类的操作方法一样
//Console.WriteLine(tmp.id);
//Console.WriteLine(tmp.name);
//一般用在数据传递和路由
//dynamic d = "string";
//Console.WriteLine(d);
//Console.WriteLine(d + 30);
//d = 123;
//Console.WriteLine(d);
//Console.WriteLine(d+30);
//是运行时决定
int ? i = null ;
//int j = i.HasValue ? i.Value : 0;//用三元运算符做了判断,i如果没值,就将0赋值给i;
int j = i ?? 9;//两个问号相当于获取默认值
Console.WriteLine(j);
string str = null;
string str2 = str ?? "10";
Console.ReadLine();
}
}
}
了解特性的用法
- 类似JAVA中的注解
- 继承自Attribute的特殊类型
- 可用于方法,类和程序集