C#笔记-基础知识(二)
1.类的继成
#所有类隐式继成object类
#单继成
#屏蔽(mask)一个继承数据成员,派生类声明新的相同类型,相同名称的成员。
#声明一个相同签名的函数成员,可以隐藏或屏蔽继承的函数成员,签名由名称和参数列表组成,不包括返回类型。
#明确屏蔽使用new修饰符。
#使用基类访问(base access)表达式访问隐藏的继承成员,base.Field1。
2.虚方法和覆写方法
#派生类的方法和基类的方法有相同的签名和返回类型, 基类的方法使用virtual 标注,派生类的方法使用override 标注
#方法必须有相同的可访问性,都是public, private
#不能覆写static方法或非虚方法
#方法,属性和索引器,成员类型事件都可以被声明为virtual 和override
#当使用对象基类部分的引用调用一个覆写的方法时, 方法的调用被沿派生层次上溯执行,一直到标记为overide的方法的最高派生版本
#!在构造函数中调用虚方法是极不推荐的。在执行基类的构造函数时,基类的虚方法会调用派生类的覆写方法,但这时在执行派生类的构造函数方法体之前,
!因此调用会在派生 类没有完全初始化之前传递到派生类。
3. 构造函数初始化语句
public MyCalss(int x): this(x, "a string ")
{
//C# 中这样可以调用 任意 当前类的其它 构造函数
}
4.程序集间的继承
#基类必须被声明为public 。必须在Visual Studio工程中的References节点中添加对包含该基类的程序集的引用,在Solution Explorer中找到该标题
5.抽象成员
#必须是函数成员,不能是字段和常量,可以是属性,方法,事件,索引。必须用abstract修饰,不能有实现。不能附加virtual修饰符。派生类必须实现对应的override函数
6.抽象类
#用abstract class ,不能创建实例,可以包含抽象成员或普通的非抽象成员。可以派生另一个抽象类。
7.密封类
#只能被用作独立的类。 不能用作基类, 用sealed修饰符标注
8.静态类
#类本身标记为static 。类所有成员都是静态。可以有一个静态构造函数, 不能有实例构造函数。静态类是隐式密封的,不能被继成。
9.扩展方法
#声明扩展方法的类必须声明为static, 方法本身必须是static, 扩展方法必须包含关键字this做为他的第一个参数类型,并在后面跟着它所扩展的类的名称
10.命名约定
11. 字符串前加 @ 字符串中是字面量,转义字符串不会被求值,例外的是相邻的双引号,他们被解释为单个双引号,
string rst = "value 1 \t 5, val2 \t 10";
string vst = @"value 1 \t 5,“” val“” 2 \t 10"; //不解释制表符
12. 定义类的转换,重载运算符
class LimitedInt
{
private int _value = 9;
public static implicit operator int (LimitedInt li)
{
return li._value;
}
public static implicit operator LimitedInt(int x)
{
var li = new LimitedInt();
li._value = x;
return li;
}
public static LimitedInt operator + (LimitedInt x , double y)
{
LimitedInt li = new LimitedInt();
li._value = x._value + (int)y;
return li;
}
}
13. typeof运算符
using System.Reflection;
class Program
{
static voic main()
{
Type t = typeof(LimitedInt);
FieldInfop[] fi = t.GetFields();
MethodInfo[] mi = t.GetMethods();
var s = new LimitedInt();
foreach(MethodInfo m in mi)
Console.WriteLine("Method:{0}", m.Name);
Console.writeLine("{0}", s.GetType().Name);
}
}
14. using语句帮助减少意外的运行时错误带来的潜在问题,包装了资源的使用。它执行下列内容:
*分配资源
*statement放进try块
*创建资源的Dispose 方法的调用, 并把它放进finally块
class Program
{
using(TextWriter tw1 = File.Createtext("aaa.txt"),
tw2 = File.CreateText("bbb.txt"))
{
tw1.WriteLine("for score and seven years ago, ... ");
tw2.writeLine("early to bed; early to rise .. ");
}
using(TextReader tr1 = File.OpenText("aaa.txt"),
tr2 = File.OpenText("bbb.txt"))
{
string InputString;
while( null != (InputString = tr1.ReadLine()))
console.WriteLine(InputSring);
while( null != (InputStinrg = tr2.ReadLine()))
COnsole.WriteLine(InputString);
}
}
》结构是值类型, 结构本身派生自System.ValueType > object
》enum [Flasgs]特性,不会改变计算结果, 但却提供了一些方便的特性,
》》它能知编译器,该枚举成员不公可以用作单独的值, 还可以按位标志进行组合,
》》它允许枚举的ToString的方法为位标志的值提代更多的格式化信息。
》