1.4、开发环境、测试环境、发布环境
三、高级C#技术
1、类型推断
C#是一种强类型化的语言,每个变量都有固定的类型。从C#3引入了新关键字var,可以代替变量的类型,但是并不是说变量的类型就是var,也不是说变量的类型是可变的,而是说变量的类型采用了隐式化的类型,具体类型依赖编译器来确定。所以var申明的变量,必须同时初始化该变量,否则编译器就无法确认变量的类型.
语句 | 是否可编译 |
var name = 1; | ✅ |
var name; | ❌ |
匿名指定数组
时,必须满足以下条件之一
1:相同的类型
2:相同的引用类型或空
3:所有元素的类型都可以隐式转换为一个类型
语句 | 是否可编译 |
var myArray = new[] { 1, "test", 2 }; | ❌ |
var myArray = new[] { 1, null, 2 }; | ❌ |
var myArray = new int?[] { 1, null, 2 }; | ✅ |
2、匿名类型
匿名类型是简化编程模型的一种方式,C#编译器会根据要存储的数据自动创建类型
如下实体对象Model
public class Student { public string name {get; set;} }
实例化该Model
Student student = new Student { name = "东方不败"; };
如果使用匿名类型
var student = new { name = "东方不败"; };
注意:匿名属性是只读的,无法修改其属性的值
1:匿名类使用var关键字
2:new 后面没有类型名
3、动态查找
前面说到C#是一种强类型化的语言,但是从C#4开始,引入“动态变量”的概念,也就是类型可变的变量。
//定义动态变量 dynamic dynamicParam;
public class Student { public string say() => "I am a student"; } public class Teacher { public string say() => "I am a teacher"; } class Start { static dynamic GetPerson(string type) { if (type == "0") { return new Student(); } else { return new Teacher(); } } static void Main(string[] args) { while (true) { string line = ReadLine(); dynamic person = GetPerson(line); WriteLine(person.say()); } } }
运行结果
var 与dynamic比较
-- | 差异 |
var | 编译器语法糖,编译时自动匹配实际类型 |
dynamic | 编译后实际是一个Object类型 |
4、高级方法参数
4.1、可选参数值
public static void print(String text, Boolean b) { if (b) { WriteLine(text); } else { WriteLine("default string print"); } }
一般调用方式
print("sssss", false); print("sssss", true);
如果布尔型参数不是必须的,不想传递时,可以如下改造,类似java的重载
public static void print(String text, Boolean b) { if (b) { WriteLine(text); } else { WriteLine("default string print"); } } public static void print(String text) => print(text, false);
还有一种更简单的方式。
public static void print(String text, Boolean b=false) { if (b) { WriteLine(text); } else { WriteLine("default string print"); } }
print("sssss", true); print("sssss");
还有一种就是通过Optional关键字指定可选参数,但是不能指定默认值
public static void print(String text, [Optional] Boolean b) { if (b) { WriteLine(text); } else { WriteLine("default string print"); } }
4.2、可选参数的顺序
1:可选参数必须放在参数列表尾部
2:有默认值得参数必须放在没有默认值参数的前面
委托使用的过程
1:定义委托声明
2:定义委托变量
3:委托变量的初始化(实际上就是将函数的引用赋值给委托变量)
4:使用委托