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.

 

      

      

 

posted on 2022-07-09 18:30  ReadyLoveMiku  阅读(39)  评论(0编辑  收藏  举报