C# 细节集锦
1. 静态函数和数据无法被class实体访问
2. public : 外部都可以访问
private: 同一个class中的函数可访问
protected:class内部&继承的class可以访问
internal: 同一个 Assembly 下可以访问 //程序集 不等于 namespace
protected internal: 两者并集合
3. C# new出来的变量离开作用域会被自动回收。若想保持new出的object直到composite 它的object消失再退出,则需要将obj声明放在class内函数外。
4. 继承的范围:public & protected 的data都可以被继承的class访问。
接口(interface)
接口成员访问修饰符默认为public,且不能显示使用访问修饰符。
类(class)
构造函数默认为public访问修饰符。
析构函数不能显示使用访问修饰符且默认为private访问修饰符。
类的成员默认访问修饰符为private;
枚举(enum)
枚举类型成员默认为public访问修饰符,且不能显示使用修饰符。
结构(struct)
结构成员默认为private修饰符。
结构成员无法声明为protected成员,因为结构不支持继承。
嵌套类型
嵌套类型的默认访问修饰符为private。 和类,结构的成员默认访问类型一致。
5. 虚函数继承重写
Public virtual void Method()
{
//////
}
public override void Method()
{
//override
}
6. 多态
1. 静态多态(编译时决定) 函数重载,operator重载
2. 动态多态 (运行时决定)向上转型类型,uper cast,通过虚表 动态绑定到具体函数。
3.
7. Solution ---project 1 --.csproj(configurations)
-- bin (二进制文件)
--
---project 2
---project 3
8. .Net Framework
sites:microsoft.com c# XXXX 搜索C# 操作
创建&添加对程序集的引用
1.
// 这些都是assembly文件,按我的理解都是已经编译好的接口
2. Nuget
9. Property的使用 (用set get 来修饰data ,可起到在读取或者设置时对操作的限制)
1 using System; 2 3 class TimePeriod 4 { 5 private double _seconds; 6 7 public double Hours 8 { 9 get { return _seconds / 3600; } 10 set { 11 if (value < 0 || value > 24) 12 throw new ArgumentOutOfRangeException( 13 $"{nameof(value)} must be between 0 and 24."); 14 15 _seconds = value * 3600; 16 } 17 } 18 } 19 20 class Program 21 { 22 static void Main() 23 { 24 TimePeriod t = new TimePeriod(); 25 // The property assignment causes the 'set' accessor to be called. 26 t.Hours = 24; 27 28 // Retrieving the property causes the 'get' accessor to be called. 29 Console.WriteLine($"Time in hours: {t.Hours}"); 30 } 31 }
10.
Dictionary
Dic [“Key”].[data filed]
LINQ 语法
LINQ query: (可以从容器按照SQL语法筛选data)
var bmws = from car in cars // var 类似C++的auto
where car.make == "BMW" && (条件2)
select car;
LINQ method
11.
Lambda 表达式:
1 //lambda 细小函数 2 // (arg1 , arg2) => { 函数body return ..} 3 Func<int, int, int> func = 4 new Func<int, int, int>( (int a, int b) => { return a + b; });
12. 委托delegate:
1 //自定义委托 2 // !~委托是一种类型 3 // 声明方式类似C/C++ 4 // delegate + 返回类型 + (参数列表) 5 // 委托与封装的方法必须参数类型兼容,形参命名不同不影响 6 public delegate double Calc(double a, double b);
C# 自带的两个天然委托
1. Action(...) 只接受void返回值的,函数指针。
//Action 委托 only接收void 返回 且无参数的函数address Action action = new Action(calculator.Report); action.Invoke(); action(); //函数指针
2. Func<in,in... out> func = new Func<int, int, int>(calculator.Add); 接受返回值自定义的回调
3. //委托的范型
delegate T MyGenarDele<T>(T a, T b);
13. C#接口的显式实现
1 using System; 2 3 namespace CSharp_interface02 4 { 5 interface IGentleman{ 6 void Love(); 7 } 8 9 interface IKiller{ 10 void Kill(); 11 } 12 13 class WarmKiller:IKiller,IGentleman 14 { 15 //显式接口实现 16 //当一个class具有两面性的时候,不想让他的某一面被外界轻易调用 17 // 需要强制指明类型才可调用 18 void IKiller.Kill() 19 { 20 Console.WriteLine("KILLL"); 21 } 22 23 public void Love() 24 { 25 Console.WriteLine("LOVE MIKU"); 26 } 27 } 28 29 class Program 30 { 31 static void Main(string[] args) 32 { 33 WarmKiller wk = new WarmKiller(); 34 wk.Love(); 35 IKiller killer = wk as IKiller; // (IKiller)wk 36 killer.Kill(); 37 } 38 } 39 }
14.读取二进制文件,wocNB
Assembly assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(file);
从文件中读取的一系列的二进制文件可通过 GetTypes()将class全部读出 eg:Animal_Lib1.Cat. 从而不用经过创造实例来获取函数。
15. 相对路径获取
var folder = Path.Combine(Environment.CurrentDirectory, "Animals");
Tips
1. C# initializer list: class A = new class() {initializer list}
2. C# 默认构造器会被自定义版本顶掉,如要使用需要手动写default ctr
3. C# De-contstructor 既然已经有垃圾回收,为啥还要de-ctr
4. Member class 嵌套类
5. C#声明定义都在一起,无区分。
6. .Net Framework vs ASP .Net core = spring restful API
///////////////////////////////继承
//1. C#单继承
//2. 子类accessibility 无法超越 父类
//3. 全盘继承 member data/method 构造器不被继承
//4. 横向扩展:对member data数量扩充
//5. 纵向:override data
//6. 子类在创建时默认调用父类 default ctor, 若父类不存在 childe_ctor():base_ctor()
//7. class自身的访问级别决定了member data访问级别的上限
//8. class default type = internal member data default type = private
//9. protected 是跨程序集的
//10. internal protected 合用 取并集
////////
IEnumerator
foreach这种函数所遍历的collection必须实现该接口. IEnumerator.current 返回当前遍历对象,until either MoveNext or Reset is called.