C#基础教学---献给初入C#的自己和同道中人二
以下内容均为基础薄弱或没有基础的同学而写
如有错误,各位高手还请留言指正!
注:小弟处女作,各位看官还请捧个人场。
二 语法
在开篇里,引用类型和值类型大家或许还有疑问。这一篇里我将用几个小例子+图解来进一步让大家看到他们的区别。然后会在这个过程里,向大家介绍C#的基本语法。语法涉及有:访问修饰符,语句,语句块,语句的构成要素和三种注释。
有很多学习C#的初学者,并没有任何语法基础。我会用公式+代码来讲解下C#里最基础的语法。
在这里,先说设想下这样一个场景。
今天奥斯卡电话通知我,内容是我获得了奥斯卡影虫奖。
到领奖那天。
台上的主持人先会说个开场:我即将介绍的电影名叫《一个程序员的自我修真之路》,叽里呱啦说了一堆颁奖词之后。会念出结束语:下面,我们有请似是若有所失上台领奖。到了这,我就会屁颠屁颠的上台领奖了。
这段颁奖词中,有很明确的开始信号和结束信号。这让我不会错过听到所有关于我的颁奖词,也免除了我尴尬的到处寻问什么时候该我上台领奖。
同样的道理,C#里,我们所写的代码,也应该有相应的约定来告诉编译器我们写了些什么内容。从哪开始,到哪结束。
PS:下面的公式中 []符号范围内的内容是可选项。 /符号两边的选择其中一种
开始与结束
有两种标志意味着开始和结束
{}表示语句块的开始和结束
;表示一句话的结束,下一句话的开始。
常用语句格式,有下面几种
声明/定义语句:
[访问修饰符] [特殊关键字] 类型 名称{} //定义一个属性,类所使用的语句。
[访问修饰符] [特殊关键字] 类型 名称; //定义一个字段所使用的语句。
[访问修饰符] [特殊关键字] 返回值类型 名称() {} //定义一个方法所使用。
[访问修饰符] [特殊关键字] 返回值类型 名称() ; //在接口/抽象类中声明一个方法。
赋值/调用语句
[ [命名空间.] 类.] 属性/对象 =[(数据类型)] [ [命名空间.] 类.] 具体值/非void方法/属性;
[ [命名空间.] 类.] 对象.方法/对象.属性;
当然,C#语法使用方式很多。以上列举了最常用的几种方式。这能让没有语法基础的同学有个模式来了解一些基础语法。并不需要你去背下来!因为语法会在你以后的使用中,练成本能。
请试着读懂下面的代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class ExampleDescription 2 { 3 public int desriptionValue; 4 public int desriptionVar; 5 6 /// <summary> 7 /// 调用这个方法,让两个值类型变量的值相同 8 /// </summary> 9 public void DesriptMethod() 10 { 11 desriptionVar = desriptionValue; 12 } 13 } 14 15 16 class Program 17 { 18 19 static void Main(string[] args) 20 { 21 ExampleDescription examp = new ExampleDescription(); 22 23 examp.desriptionValue = 10; //初始化变量。 24 ExampleDescription exampref = examp; //这里让examp和exampref拥有同一个引用值。如图一解释 25 26 27 examp.DesriptMethod(); //让类中的两个值类型变量的值相同 如图二解释 28 Console.WriteLine("examp中的desriptionValue={0} \n examp中的desriptionVar={1}" 29 , examp.desriptionValue 30 , examp.desriptionVar); 31 32 //证实了 将一个值类型变量赋给另一个值类型变量时 对一个值类型变量执行的操作不会影响另一个值类型变量 33 examp.desriptionValue = 1; 34 Console.WriteLine("desriptionValue已经变了,那对应的desriptionVar是否改变?\n desriptionValue={0} desriptionVar={1}" 35 , examp.desriptionValue, 36 examp.desriptionVar); 37 38 //证实了 将一个引用类型变量赋给另一个引用类型变量时 对一个引用类型变量执行的操作会影响另一个引用类型变量所引用的对象 39 Console.WriteLine("exampref得到examp的引用值时,desriptionVar那时并没有赋值,来看exampref中desriptionVar的情况 \n desriptionVar={0}" 40 , exampref.desriptionVar); 41 /* 42 * examp与exampref是引用类型变量 43 * 开篇就提到过,对一个引用类型变量执行的操作会影响另一个引用类型变量所引用的对象 44 * 所以,在exampref中的desriptionVar会随着examp中的desriptionVar改变而改变 45 * 这里是examp的改变同时改变了exampref。 46 */ 47 48 Console.ReadKey(); 49 } 50 }
图一
图二
上面的语法公式中,提到了接口、抽象类、类、对象、方法、属性、字段、命名空间、访问修饰符、特殊关键字 这几个名词。这里我从C#的角度来解释类、方法、属性、字段这几个名词。命名空间、访问修饰符、特殊关键字将在下一篇随笔中介绍给大家。至于接口、抽象类。我留在后面的内容进行详细的阐述。
我们从访问修饰符开始吧。
C#中一共有四个访问修饰符,五种访问级别。
private(私有的):C#中访问级别最低的访问修饰符。被private所修饰的类,对象,方法,属性字段只能在该类的内部使用。
public(公有的):C#中访问级别最高的访问修饰符。被public所修饰的类,对象,方法,属性字段可以在任何地方使用。
protected(受保护的):C#中继承性访问修饰符。被protected所修饰的类,对象,方法,属性只能出现在该类的内部和该类的子类中使用。
internal(同一程序集的):.DLL称为一个程序集,被internal所修饰的类,对象,方法,属性在只能出现在该类的同一个.DLL程序集中使用。
protected internal :集中了上面两种访问级别。被protected internal所修饰的类,对象,方法,属性可在该类所在的程序集,该类的内部,该类的子类中使用。
使用class关键字的作用:定义一个类。类属于引用类型。
语法规则:
class 类名{}
如 class ClassName{}
命名规则:类名中的每一个英文单词首字母大写即可。
类是一个抽象化的概念,这种理念来自于面向对象。但面向对象不是本篇的重点,遂略过不谈。
每一个类,都有与之相关的属性、方法、字段。
字段是类的自我描述,它能使类的每一个实例拥有差异性。在C#中,提倡给字段设定private级别的访问修饰符,最不建议使用的是public级别的访问修饰符。这样做的好处是能防止类的信息随意泄露或修改。
字段通常被定义到类内部的最开始处。
语法规则:
[访问修饰符] [数据类型] 字段名称;
如: private ClassName classname; private int _sex; //此处的ClassName是被class修饰的一个类。所定义的字段也称类的实例。
命名规则:字段通常用全小写的英文表示,可用 _ 开头。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class ExampleDescription 2 { 3 #region 以下都是字段,能让类拥有自我描述性。通常位于类内部的最开始处 4 private int desriptionValue; 5 private string desriptionVar; 6 private ExampleDescription description; 7 private string desription; 8 #endregion 9 }
属性是类对外的动态自我描述。通过属性,一个类的实例能与另一个类的实例进行沟通。合理的设置属性,可使得类能对外描述自身,同时也能防止外部类对该类字段的恶意修改。属性和字段看起来会很迷惑。因为他们实在太相似。想要说清二者的区别,需要更多的篇幅。基于这篇文章内容太杂。我将二者的联系与区别做一个单独的随笔来谈。在C#中,虽然可以为一个属性设置private,但基于它的设计,通常不会用private来修饰一个属性。
语法规则
[访问修饰符] [数据类型] 属性名称
{
[访问修饰符] [get { return 字段名称或者字段组合; } ]
[访问修饰符] [set { 字段名称=value; } ]
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class ExampleDescription 2 { 3 #region 以下都是字段,能让类拥有自我描述性。通常位于类内部的最开始处 4 private int desriptionValue; 5 private string desriptionVar; 6 private ExampleDescription description; 7 private string descriptionString; 8 #endregion 9 10 #region 这里是属性 11 public int DesriptionValue 12 { 13 get 14 { 15 return desriptionValue; 16 } 17 set 18 { 19 desriptionValue = value; 20 } 21 } 22 23 public string DesriptionVar 24 { 25 get 26 { 27 return desriptionVar; 28 } 29 } 30 31 public ExampleDescription Description 32 { 33 get; 34 set; 35 } 36 37 public string DescriptionString 38 { 39 set 40 { 41 descriptionString = value; 42 } 43 } 44 #endregion 45 }
方法,则是对类的行为描述。我们通过类中的方法可以明确的知道这个类能执行什么样的行为。
语法规则
[访问修饰符][特殊关键字][返回值类型] 方法名称
{
//多条语句
[return] [返回值类型];
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class ExampleDescription 2 { 3 #region 以下都是字段,能让类拥有自我描述性。通常位于类内部的最开始处 4 private int desriptionValue; 5 private string desriptionVar; 6 private ExampleDescription description; 7 private string descriptionString; 8 #endregion 9 10 #region 这里是属性 11 public int DesriptionValue 12 { 13 get 14 { 15 return desriptionValue; 16 } 17 set 18 { 19 desriptionValue = value; 20 } 21 } 22 23 public string DesriptionVar 24 { 25 get 26 { 27 return desriptionVar; 28 } 29 } 30 31 public ExampleDescription Description 32 { 33 get; 34 set; 35 } 36 37 public string DescriptionString 38 { 39 set 40 { 41 descriptionString = value; 42 } 43 } 44 #endregion 45 46 #region 这里是方法 47 /// <summary> 48 /// 构造方法,省略不写时,系统会为我们创建一个里面没有任何代 49 ///码的构造方法 50 /// </summary> 51 public ExampleDescription() 52 { 53 description = new ExampleDescription(); 54 } 55 56 /// <summary> 57 /// 这是一个返回int类型值的方法 58 /// </summary> 59 public int DesriptInt() 60 { 61 return desriptionValue*3; 62 } 63 64 65 /// <summary> 66 /// 这是一个返回string类型值的方法 67 /// </summary> 68 public string DesriptString() 69 { 70 return desriptionVar; 71 } 72 73 /// <summary> 74 /// 这是一个无返回值的方法 75 /// </summary> 76 public void DesriptMethod() 77 { 78 Console.WriteLine("这是一个无返回值的方法,由void修饰的方法不需要用到return。"); 79 } 80 #endregion 81 }
C#是面向对象的语言。在对这些名词进行解释时。通常需要一个从陌生到熟悉的过程。但这并不妨碍我们知道这四个名词的代码是什么样子的。