类(Class)
1. 静态类,如果类只包含静态的方法和属性,该类就是静态的.静态类在功能上与使用私有静态函数创建的类相同.不能创建静态类的实例,静态类不能被继承.使用static关键字,编译器可以检查以后是否给该类添加了实例成员,这可以确保不创建静态类的实例.
2. 部分类,partial关键字允许类,接口或结构放在多个文件中,这样做的好处:
1) 一个大型的项目类可以同时分成不同的区块交由不同的程序员拽写,同时进行
2) 若有系统自动产生source,可以用独立的Partial Class加入,而不用更改原先的类
3) 当类很大时,可以用Partial Class做功能性划分,这也是一种不错的分类方式
如果在声明类时使用了以下的关键字,这些类将用于同一个类的所有部分:
public, private, protected, internal, abstract, sealed, new
在把部分类编译到类型中时,会合并属性,XML 注释,接口,泛型类型的参数属性和成员
3. 匿名类,匿名类型只是一个继承了Object的,没有名字的类。该类得定义初始化器中推断,类似于隐式类型化的变量。
4. 内部类,C#中的内部类能够使用外部类定义的类型和静态方法,但是不直接使用外部类的实例方法,直接看来,外部类的作用更像是一个命名空间,在C#中,始终可以用Sys.Model.Key key = new Sys.Model.Key();来创建一个内部类的实例,这个实例与外部类的任何实例没有任何直接的关系。类似于Java中的静态内部类。
C#中,类分为Nested Class和Non-Nested Class,前者是声明在其他数据类型内部的类。后者是直接定义在某一命名空间的类。
非嵌套类只允许使用public和internal的访问控制,而内置类则允许使用所有的5种访问修饰符。内部类也可以访问外部类的所有方法,包括instance方法和private方法,但是需要显示的传递一个外部类的实例
内部类的反射名称的.改为+,例如Sys.Model+Key[其中Key是Model的内部类]
5. 抽象类,C#中允许将类和方法声明为abstract,抽象类不能实例化,而抽象函数没有执行代码,必须由非抽象的派生类中重写。如果类包含抽象函数,该类也是抽象的,也必须声明为抽象的。抽象类不能被密封
6. 密封类,C#中把类和方法声明为sealed。对于类来说,这表示不能继承该类;对于方法来说,表示不能重写该方法。当用于方法或属性时,sealed修饰符必须始终与override一起使用
.NET基类库大量使用了密封类,使希望从这些类中派生出自己类的第三方开发人员无法访问这些类
Java开发人员可以把C#中的sealed当作Java中的final
Codes:
class Program
{
static void Main(string[] args)
{
PartialClass partialClass = new PartialClass();
Console.WriteLine(partialClass.Method("Xufei"));
Console.WriteLine();
InstanceClass instanceClass = new ChildClass();
InstanceClass instanceClass1 = new InstanceClass();
Console.WriteLine(instanceClass1.Method("Xufei"));
Console.WriteLine(instanceClass.Method("Xufei"));
Console.WriteLine();
Console.WriteLine(StaticClass.Method());
Console.WriteLine();
InstanceClass.NestedClass nestedClass = new InstanceClass.NestedClass();
Console.WriteLine(nestedClass.Method("Xufei"));
Console.WriteLine();
InstanceClass.NestedClass nestedClass2 = InstanceClass.nestedClass;
Console.WriteLine(nestedClass2.Method());
Console.WriteLine();
Console.WriteLine(instanceClass.Method());
Console.ReadKey();
}
}
/// <summary>
/// 普?通ª¡§类¤¨¤
/// </summary>
class InstanceClass
{
public static NestedClass nestedClass;
public virtual string Method(string str)
{
return str;
}
static InstanceClass()
{
nestedClass = new NestedClass("Xufei");
}
/// <summary>
/// 匿?名?类¤¨¤dynamicClass
/// </summary>
/// <returns></returns>
public string Method()
{
var dynamicClass = new { name = "Xufei", hometown = "Liayang" };
return dynamicClass.name;
}
/// <summary>
/// 内¨²部?类¤¨¤
/// </summary>
public class NestedClass
{
string str;
public string Method()
{
InstanceClass instanceClass = new InstanceClass();
return instanceClass.Method(str);
}
public string Method(string str)
{
InstanceClass instanceClass = new InstanceClass();
return instanceClass.Method(str);
}
public NestedClass() { }
public NestedClass(string theStr)
{
str=theStr;
}
}
}
/// <summary>
/// 子Á¨®类¤¨¤
/// </summary>
class ChildClass : InstanceClass
{
public sealed override string Method(string str)
{
return str + " Fan";
}
}
/// <summary>
/// 静2态¬?类¤¨¤
/// </summary>
static class StaticClass
{
private static string str;
public static string Method()
{
return str;
}
static StaticClass()
{
str = "Xufei";
}
}
/// <summary>
/// 抽¨¦象¨®类¤¨¤
/// </summary>
abstract class AbstractClass
{
public abstract void Method();
public virtual string Method(string str)
{
return str;
}
}
/// <summary>
/// 密¨¹封¤a类¤¨¤
/// </summary>
sealed class SealedClass : AbstractClass
{
public sealed override void Method(){}
public sealed override string Method(string str)
{
return base.Method(str);
}
}
/// <summary>
/// 部?分¤?类¤¨¤
/// </summary>
partial class PartialClass
{
public void Method() { }
}
partial class PartialClass
{
public string Method(string str)
{
return str;
}
}