C#新手学习_自用

第一部分:(转)

IL(Intermediate Language):.NET框架的中间语言。

程序集:(1)把IL代码和元数据以及一些资源文件,通过C#编译器,程序集链接器组装而成。

               (2)由.NET 编译生成的EXE文件或DLL文件。

程序集结构:

1.程序集清单:和我们在淘宝买东西的配送清单一样就是说明里面包含了什么东东。

2.类型元数据:类型元数据是描述程序集中定义的类型的信息,由一些元数据表组成,包含 类、方法、属性、参数、返回值等。

3.MSIL代码:每一种类型的二进制代码,这些代码存储为与机器无关的MSIL代码。

4.资源:程序的不可执行部分,比如图片等。

 

 

托管于非托管:

 

对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.net CLR如何做这些操作。也就是说对于您的应用程序创建的大多数对象,可以依靠 .NET Framework 的垃圾回收器隐式地执行所有必要的内存管理任务,对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们,例如 System.IO.StreamReader的一个文件对象,必须显示的调用对象的Close()方法关闭它,否则会占用系统的内存和资源,而且可能会出现意想不到的错误。



Internal 关键字:

(1)被Internal修饰的东西只能在本程序集(当前项目)内被使用。

(2)被 protected internal 修饰的属性/方法 可以在其他项目中,被派生类使用。

例子:https://blog.csdn.net/manmadewind/article/details/6638454#

 

readonly关键字:

(1)readonly指示只能在声明期间或在同一个类的构造函数中向字段赋值。 可以在字段声明和构造函数中多次分配和重新分配只读字段。构造函数退出后,不能分配 readonly 字段

class Age
{
    readonly int year;
    Age(int year)
    {
        this.year = year;
    }
    void ChangeYear()
    {
        //year = 1967; // Compile error if uncommented.
    }
}

 

delegate关键字:

(1)委托的声明指定了一个返回类型和一个参数列表;

         在定义了委托后,就可以声明该委托类型的变量。接着把这个变量初始化为与委托有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。例如,可以把委托变量作为参数传递给一个函数,这样,该函数就可以使用委托调用它引用的任何函数

class Program  
   {  
       delegate double ProcessDelegate(double param1, double param2);  
       static double Multiply(double param1, double param2)  
       {  
           return param1 * param2;  
       }  
       static double Divide(double param1, double param2)  
       {  
           return param1 / param2;  
       }  
       static void Main(string[] args)  
       {  
           ProcessDelegate process;  
           Console.WriteLine("Enter 2 numbers separated with a comma:");  
           string input = Console.ReadLine();  
           int commaPos = input.IndexOf(',');  
           double param1 = Convert.ToDouble(input.Substring(0, commaPos));  
           double param2 = Convert.ToDouble(input.Substring(commaPos + 1,  
           input.Length - commaPos - 1));  
           Console.WriteLine("Enter M to multiply or D to divide:");  
           input = Console.ReadLine();  
           if (input == "M")  
               process = new ProcessDelegate(Multiply);  
           else  
               process = new ProcessDelegate(Divide);  
           Console.WriteLine("Result: {0}", process(param1, param2));  
           Console.ReadKey();  
       }   
   }  

 字段:SecurityCritical

 若要使用安全关键类型,引用该类型的代码必须是安全关键或安全可靠关键。即使引用是间接的,也需如此。例如,当你引用具有关键类型的透明字段时,你的代码必须是安全关键的或安全可靠的。因此,具有安全透明字段或安全可靠关键字段具有误导性,因为透明代码仍然无法访问该字段。

https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2013/dn621098(v%3dvs.120)

 

字段:[ComVisible(true)]
简单的说就是你的bai托管代码是否允许非托管代码调用。bai这个涉及到.NET的平台互操作问du题。比zhi如,C#可以调用C\C++写的DLL,也可以操纵MS Office的组件这就称之为互操作(Invoke)。那么如果你也想让C\C++也来调用你的C#写的程序,此时就需要开放你的类为对COM可见性。

 

char和byte的区别

byte 是字节数据类型 ,是有符号型的,占1 个字节;大小范围为-128—127 。char 是字符数据类型 ,是无符号型的,占2字节(Unicode码 );大小范围 是0—65535 ;char是一个16位二进制的Unicode字符,JAVA用char来表示一个字符 。

 

Marshal类:

将数据从托管对象封送到非托管内存块。

int personSize = Marshal.SizeOf( typeof(Person) );
IntPtr intPer = Marshal.AllocHGlobal( personSize );
//将数据从托管对象封送到非托管内存块,该内存块开始地址为intPer
Marshal.StructureToPtr( person, intPer, true );                                                                                                             
 //将数据从非托管内存块封送到新分配的指定类型的托管对象anotherPerson
Person anotherPerson=Marshal.PtrToStructure(  intPer, typeof(Person) );

  

Event:

一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。

C# 中使用事件机制实现线程间的通信。

https://www.runoob.com/csharp/csharp-event.html

 

Virtual 关键字

1) virtual修饰符用于修改方法或属性的声明,在这种情况下,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写成员更改。

2)在静态属性上使用C# virtual修饰符是错误的。

3)通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。

https://blog.csdn.net/qq_23018459/article/details/88019845

 

IntPtr类型

IntPtr 可以用来表示指针或句柄、它是一个平台特定类型。对于它的解释,这个哥们写的比较好:It's a class that wraps a pointer that is used when calling Windows API functions. The underlying pointer may be 32 bit or 64 bit, depending on the platform.

用在什么地方:

(1)C#调用WIN32 API时

(2)C#调用C/C++写的DLL时(其实和1相同,只是这个一般是我们在和他人合作开发时经常用到)

 

 

第二部分:

C#是.NET框架的一部分,用于编写.NET应用程序.

1.引用类型:引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用,换句话说,它们指的是一个内存位置。

 

1)Object 对象类型:

对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。

 

2)Dynamic动态类型:

您可以存储任何类型的值在动态数据类型变量中。

 

3)可空类型 Nullable

 

2.单问号?:单问号用于对 int,double,bool 等无法直接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是 NullAble 类型的。

双问号??: 可用于判断一个变量在为 null 时返回一个指定的值;如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。下面的实例演示了这点

using System;
namespace CalculatorApplication
{
   class NullablesAtShow
   {
         
      static void Main(string[] args)
      {
         
         double? num1 = null;
         double? num2 = 3.14157;
         double num3;
         num3 = num1 ?? 5.34;      // num1 如果为空值则返回 5.34
         Console.WriteLine("num3 的值: {0}", num3);
         num3 = num2 ?? 5.34;
         Console.WriteLine("num3 的值: {0}", num3);
         Console.ReadLine();

      }
   }
}

//结果:
//num3 的值: 5.34
//num3 的值: 3.14157

 

 

3.Mutex

C#中Mutex是互斥锁,位于System.Threading 命名空间中。顾名思义,它是一个互斥的对象,同一时间只有一个线程可以拥有它,该类还可用于进程间同步的同步基元。

线程使用Mutex.WaitOne()方法等待C# Mutex对象被释放,如果它等待的C# Mutex对象被释放了,它就自动拥有这个对象,直到它调用Mutex.ReleaseMutex()方法释放这个对象,而在此期间,其他想要获取这个C# Mutex对象的线程都只有等待。

https://blog.csdn.net/qq_30725967/article/details/90201771

 

4.HashSet:

https://www.cnblogs.com/yxcn/p/11322521.html

 

5.ref和out

与ref关键字一样,out关键字也是按引用来传递的.out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字

尽管作为 out 参数传递的变量不需要在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。

我们发现,ref和out似乎可以实现相同的功能.因为都可以改变传递到方法中的变量的值.但是,二者本质的区别就是,ref是传入值,out是传出值.在含有out关键字的方法中,变量必须由方法参数中不含out(可以是ref)的变量赋值或者由全局(即方法可以使用的该方法外部变量)变量赋值,out的宗旨是保证每一个传出变量都必须被赋值

示例演示了out关键字的使用方法,其功能是获取数组中的最大值和最大值的索引

 

6.Parse()类型转换

 

7.函数中的get、set:

 

8.Invoke():

https://www.cnblogs.com/winformasp/articles/12034206.html

 

9.C#中Console.WriteLine()函数输出格式详解

blog.csdn.net/yousss/article/details/84790040

 

10.构造函数后加冒号,初始化成员变量

构造函数后,接单冒号表示bai初始化列表。具体形du式为
对于class TEST,存在成员变量int a,b,c;
那么
TEST(int x, int y):a(x),b(y),c(0){}
的效果zhi就是用括号内的值,dao来初始化成员变量值。
与函数内部赋值相比,初始化列表的方式更高效。
需要注意的是,初始化的顺序并不是依赖于a,b,c在初始化列表中出现的顺序,而是与类中定义a,b,c的顺序相同。
如果TEST定义为
class TEST
{
public:
int b;
int c;
int a;
TEST(int x, int y):a(x),b(y),c(0){}
};
那么在执行构造函数时,实际的初始化顺序为b,c,a,而不是a,b,c.

 

 

11.构造函数后(:base,this)

因为子类不能直接继承父类的构造函数,因此需要使用base的方法来调用父类的构造函数,而tihs,是因为有参数的构造函数需要执行无参构造函数中的代码,为了省去重复代码的编写,所以就继承了。即委托构造

 

 

12.#region

#region 是 C# 预处理器指令。
#region 是一个分块预处理命令,它主要是用于编辑器代码的分块,在编译时会被自动删除。

#region 块必须以 #endregion 指令终止。
#region 块不能与 #if 块重叠。但是,可以将 #region 块嵌套在 #if 块内,或将 #if 块嵌套在 #region 块内。

这是为了给编辑器识别代码折叠准备的.本身没有任何意义.让你在看代码时能快速知道一个功能是哪里开始,哪里结束.

posted @ 2020-07-07 14:32  参宿七  阅读(496)  评论(0)    收藏  举报