C#学习笔记

160 阅读5分钟

程序结构

//**using** 关键字用于在程序中包含 **System** 命名空间。 一个程序一般有多个 **using** 语句
using System;  
//一个 **namespace** 里包含了一系列的类。*HelloWorldApplication* 命名空间包含了类 *HelloWorld*
namespace HelloWorldApplication  
{  
//类 *HelloWorld* 包含了程序使用的数据和方法声明。类一般包含多个方法。方法定义了类的行为
   class HelloWorld  
   {  
   //**Main** 方法,是所有 C# 程序的 **入口点**。**Main** 方法说明当执行时 类将做什么动作
      static void Main(string[] args)  
      {  
         /* 我的第一个 C# 程序*/  
         Console.WriteLine("Hello World");  
      }  
   }  
}于ufa

基本语法

标识符

标识符是用来识别类、变量、函数或任何其它用户定义的项目。在 C# 中,类的命名必须遵循如下基本规则:

  • 标识符必须以字母、下划线或 @ 开头,后面可以跟一系列的字母、数字( 0 - 9 )、下划线( _ )、@。
  • 标识符中的第一个字符不能是数字。
  • 标识符必须不包含任何嵌入的空格或符号,比如 ? - +! # % ^ & * ( ) [ ] { } . ; : " ' / \。
  • 标识符不能是 C# 关键字。除非它们有一个 @ 前缀。 例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字。
  • 标识符必须区分大小写。大写字母和小写字母被认为是不同的字母。
  • 不能与C#的类库名称相同。

关键字

数据类型

  • 值类型(Value types)
  • 引用类型(Reference types)
  • 指针类型(Pointer types)

类型转换

类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型 C# 中的类型转换可以分为两种:

  • 隐式转换
    
  • 显式转换
    

变量

常量

运算符

判断

循环

封装

 访问修饰符 

  • public:所有对象都可以访问;
  • private:对象本身在对象内部可以访问;
  • protected:只有该类对象及其子类对象可以访问
  • internal:同一个程序集的对象可以访问;
  • protected internal:访问限于当前程序集或派生自包含类的类型。

方法

一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块。每一个 C# 程序至少有一个带有 Main 方法的类。 要使用一个方法,您需要:

  • 定义方法
  • 调用方法

可空类型

单问好? 双问号??

数组

字符串

结构体

结构和类的区别:

  • 1、结构是值类型,它在栈中分配空间;而类是引用类型,它在堆中分配空间,栈中保存的只是引用。
  • 2、结构类型直接存储成员数据,让其他类的数据位于堆中,位于栈中的变量保存的是指向堆中数据对象的引用。

C# 中的简单类型,如int、double、bool等都是结构类型。如果需要的话,甚至可以使用结构类型结合运算符运算重载,再为 C# 语言创建出一种新的值类型来。

由于结构是值类型,并且直接存储数据,因此在一个对象的主要成员为数据且数据量不大的情况下,使用结构会带来更好的性能。

因为结构是值类型,因此在为结构分配内存,或者当结构超出了作用域被删除时,性能会非常好,因为他们将内联或者保存在堆栈中。当把一个结构类型的变量赋值给另一个结构时,对性能的影响取决于结构的大小,如果结构的数据成员非常多而且复杂,就会造成损失,接下来使用一段代码来说明这个问题。

结构和类的适用场合分析:

  •  1、当堆栈的空间很有限,且有大量的逻辑对象时,创建类要比创建结构好一些;
  •  2、对于点、矩形和颜色这样的轻量对象,假如要声明一个含有许多个颜色对象的数组,则CLR需要为每个对象分配内存,在这种情况下,使用结构的成本较低;
  • 3、在表现抽象和多级别的对象层次时,类是最好的选择,因为结构不支持继承。
  • 4、大多数情况下,目标类型只是含有一些数据,或者以数据为主。

枚举

enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };

继承

基类和派生类

<访问修饰符> class <基类>  
{  
 ...  
}  
class <派生类> : <基类>  
{  
 ...  
}

多重继承

class Shape  
   {  
      public void setWidth(int w)  
      {  
         width = w;  
      }  
      public void setHeight(int h)  
      {  
         height = h;  
      }  
      protected int width;  
      protected int height;  
   }  
  
   // 基类 PaintCost  
   public interface PaintCost  
   {  
      int getCost(int area);  
  
   }  
   // 派生类  
   class Rectangle : Shape, PaintCost  
   {  
      public int getArea()  
      {  
         return (width * height);  
      }  
      public int getCost(int area)  
      {  
         return area * 70;  
      }  
   } 

多态性

多态是同一个行为具有多个不同表现形式或形态的能力。

静态多态性

  • 函数重载
  • 运算符重载
函数重载

可以在同一个范围内对相同的函数名有多个定义。函数的定义必须彼此不同,可以是参数列表中的参数类型不同,也可以是参数个数不同。不能重载只有返回类型不同的函数声明。

public class TestData    
    {    
        public int Add(int a, int b, int c)    
        {    
            return a + b + c;    
        }    
        public int Add(int a, int b)    
        {    
            return a + b;    
        }    
    }

动态多态性

运算符重载

接口(Interface)

命名空间(Namespace)

使用namespace来命名,接着在其他文件可以使用using来引入该命名空间

嵌套命名空间

预处理指令

正则表达式

异常处理

文件的输入与输出

成员函数和封装

析构函数

类的静态成员