c#类的修饰符都有哪些?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#类的修饰符都有哪些?相关的知识,希望对你有一定的参考价值。

修饰符用于限定类型以及类型成员的申明,C#中的修饰符按功能可分为四部分:属性修饰符,存取修饰符,类修饰符和成员修饰符。

属性修饰符:

[Serializable]:按值将对象封送到远程服务器。在按值封送对象时,就会创建一个该对象的副本,并将其序列化传送到服务器。 任何对该对象的方法调用都是在服务器上进行的。

[STAThread]:是Single-Threaded Apartment单线程套间的意思,是一种线程模型(线程模式用于处理组件在多线程的环境里并行与并互的方式),套间线程(STAThread)模式中接口跨线程传递必须被调度(Marshal),不调度直传肯定会失败!而MTA或FreeThread模式中的接口可以不经调度直接传递。这种调度在特定的环境中非常影响性能(可有几百倍之差)。如VB里只支持STAThread模式。FreeThread模式的组件会在里面表现成和跨进程一样慢!线程模式是微软的COM基础中的极其重要的概念。一定要吃透!

[MTAThread]:是MultiThreaded Apartment多线程套间的意思,同上也是一种线程模型。

存取修饰符:

public:存取不受限制。

private:只有包含该成员的类可以存取。

internal:只有当前工程可以存取。

protected:只有包含该成员的类以及派生类可以存取。

类修饰符:

abstract:抽象类。指示一个类只能作为其它类的基类。

sealed:密封类。指示一个类不能被继承。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。

成员修饰符:

abstract:指示该方法或属性没有实现。

sealed:密封方法。可以防止在派生类中对该方法的override(重载)。不是类的每个成员方法都可以作为密封方法密封方法,必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用。

delegate:委托。用来定义一个函数指针。C#中的事件驱动是基于delegate + event的。

const:指定该成员的值只读不允许修改。

event:声明一个事件。

extern:指示方法在外部实现。

override:重写。对由基类继承成员的新实现。

readonly:指示一个域只能在声明时以及相同类的内部被赋值。

static:指示一个成员属于类型本身,而不是属于特定的对象。即在定义后可不经实例化,就可使用。

virtual:指示一个方法或存取器的实现可以在继承类中被覆盖。

new:在派生类中隐藏指定的基类成员,从而实现重写的功能。 若要隐藏继承类的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。
参考技术A 以下是我以前收集的修饰符详解,现在你需要就给分享下,希望对你也有帮助

1、访问修饰符、
  指定声明的类型和类型成员的可访问性。
  (1)public:是类型和类型成员的访问修饰符。公共访问是允许的最高访问级别。对访问公共成员没有限制。
  (2) private:是一个成员访问修饰符。私有访问是允许的最低访问级别。私有成员只有在声明它们的类和结  构体中才是可访问的。
  (3) internal:是类型和类型成员的访问修饰符。只有在同一程序集的文件中,内部类型或成员才是可访问的。
  (4)protected:是一个成员访问修饰符。受保护成员在它的类中可访问并且可由派生类访问。

2、abstract:指示某个类只能是其他类的基类。
可以和类、方法、属性、索引器及事件一起使用。在类声明中使用abstract修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
3、const:指定无法修改字段或局部变量的值。用于修改字段或局部变量的声明。它指定字段或局部变量的值是常数,不能被修改。
4、event:声明事件。类和结构使用事件将出现的可能影响对象状态的事件通知给对象。
  5、extern:指示在外部实现方法。  用于声明在外部实现的方法。extern修饰符的常见用法是在使用Interop 服务调入非托管代码时与DllImport属性一起使用;在这种情况下,该方法还必须声明为static。  extern关键字还可以定义外部程序集别名,使得可以从单个程序集中引用同一组件的不同版本。将abstract和extern修饰符一起使用来修改同一成员是错误的。使用extern修饰符意味着方法在C# 代码的外部实现,而使用abstract修饰符意味着在类中未提供方法实现。  6、new:从基类成员隐藏继承的成员。
  在用作修饰符时,new关键字可以显式隐藏从基类继承的成员。隐藏继承的成员意味着该成员的派生版本将替换基类版本。在不使用new修饰符的情况下隐藏成员是允许的,但会生成警告。使用new显式隐藏成员会取消此警告,并记录代之以派生版本这一事实。  若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并使用new修饰符修饰该成员。  对同一成员同时使用new和override是错误的,因为这两个修饰符在含义上相互排斥。使用new会用同样的名称创建一个新成员并使原始成员变为隐藏的,而override则扩展继承成员的实现。  在不隐藏继承成员的声明中使用new修饰符将会生成警告。
7、override:提供从基类继承的虚拟成员的新实现。 要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用override修饰符。
8、partial:在整个同一程序集中定义分部类和结构。分部类型定义允许将类、结构或接口的定义拆分到多个文件中。
9、readonly:声明一个字段,该字段只能赋值为该声明的一部分或者在同一个类的构造函数中。  是可以在字段上使用的修饰符。当字段声明包括readonly修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中。在此示例中,字段year的值无法在ChangeYear方法中更改,即使在类构造函数中给它赋了值。
10、sealed:指定类不能被继承。可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed修饰符必须始终与override一起使用。在类声明中使用sealed修饰符可防止继承此类
11、static:声明属于类型本身而不是属于特定对象的成员。声明属于类型本身而不是属于特定对象的静态成员。可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。
12、unsafe:声明不安全的上下文。该上下文是任何涉及指针的操作所必需的。
13、virtual:在派生类中声明其实现可由重写成员更改的方法或访问器。用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。默认情况下,方法是非虚拟的。不能重写非虚方法。virtual修饰符不能与static、abstract和override修饰符一起使用。除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。·在静态属性上使用virtual修饰符是错误的。
  ·通过包括使用override修饰符的属性声明,可在派生类中重写虚拟继承属性。
14、volatile:指示字段可由操作系统、硬件或并发执行线程等在程序中进行修改。volatile关键字表示字段可能被多个并发执行线程修改。声明为volatile的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值。volatile修饰符通常用于由多个线程访问而不使用lock语句(C#参考)语句对访问进行序列化的字段。volatile关键字可应用于以下类型:·引用类型。·指针类型(在不安全的上下文中)。·整型,如sbyte、byte、short、ushort、int、uint、char、float 和bool。·具有整数基类型的枚举类型。·已知为引用类型的泛型类型参数。·IntPtr和UIntPtr。所涉及的类型必须是类或结构的字段。不能将局部变量声明为volatile。
参考技术B 用于限定类型以及类型成员的申明,C#中的修饰符按功能可分为四部分:属性修饰符,存取修饰符,类修饰符和成员修饰符。

属性修饰符:

[Serializable]:按值将对象封送到远程服务器。在按值封送对象时,就会创建一个该对象的副本,并将其序列化传送到服务器。 任何对该对象的方法调用都是在服务器上进行的。

[STAThread]:是Single-Threaded Apartment单线程套间的意思,是一种线程模型(线程模式用于处理组件在多线程的环境里并行与并互的方式),套间线程(STAThread)模式中接口跨线程传递必须被调度(Marshal),不调度直传肯定会失败!而MTA或FreeThread模式中的接口可以不经调度直接传递。这种调度在特定的环境中非常影响性能(可有几百倍之差)。如VB里只支持STAThread模式。FreeThread模式的组件会在里面表现成和跨进程一样慢!线程模式是微软的COM基础中的极其重要的概念。一定要吃透!

[MTAThread]:是MultiThreaded Apartment多线程套间的意思,同上也是一种线程模型。

存取修饰符:

public:存取不受限制。

private:只有包含该成员的类可以存取。

internal:只有当前工程可以存取。

protected:只有包含该成员的类以及派生类可以存取。

类修饰符:

abstract:抽象类。指示一个类只能作为其它类的基类。

sealed:密封类。指示一个类不能被继承。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。

成员修饰符:

abstract:指示该方法或属性没有实现。

sealed:密封方法。可以防止在派生类中对该方法的override(重载)。不是类的每个成员方法都可以作为密封方法密封方法,必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用。

delegate:委托。用来定义一个函数指针。C#中的事件驱动是基于delegate + event的。

const:指定该成员的值只读不允许修改。

event:声明一个事件。

extern:指示方法在外部实现。

override:重写。对由基类继承成员的新实现。

readonly:指示一个域只能在声明时以及相同类的内部被赋值。

static:指示一个成员属于类型本身,而不是属于特定的对象。即在定义后可不经实例化,就可使用。

virtual:指示一个方法或存取器的实现可以在继承类中被覆盖。

new:在派生类中隐藏指定的基类成员,从而实现重写的功能。 若要隐藏继承类的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。

C#更改嵌套类的方法修饰符

【中文标题】C#更改嵌套类的方法修饰符【英文标题】:C# Change Method Modifier of nested Class 【发布时间】:2019-12-04 18:25:21 【问题描述】:

我想知道这是否可能: 我有课

class Class


    private Person person = new Person();
    public void NamePerson()
    
        person.Name = "Peter";
    

    public Person CPerson
    
        get
        
            return person;
        
    

    public class Person
    
        public string Name  set; get; 
    

Class 内部我想拥有person 对象的完全访问权限。 但是在Class之外有Person的写访问权限

 Class a = new Class();
 a.CPerson.Name = "Steve"; !!!!!

应该是无效的。我只想拥有读取权限。

string name = a.CPerson.Name;

有没有办法在 C# 中做到这一点??? 谢谢!

【问题讨论】:

你说得对,我也可以在Class之外定义类Person。 【参考方案1】:

您可以为此使用接口:

public interface IPerson

    string Name  get; 


public class Person : IPerson

    public string Name  get; set; 

现在在类内部,您将对象引用为Person,但只返回IPerson 的实例:

class Class

    private Person person = new Person();
    public void NamePerson()
    
        person.Name = "Peter";
    

    public IPerson CPerson
    
        get
        
            return person;
        
        

【讨论】:

以上是关于c#类的修饰符都有哪些?的主要内容,如果未能解决你的问题,请参考以下文章

成员变量和成员方法的访问控制修饰符都有哪些?

C# 可以修改MVC匿名类型的访问修饰符吗

在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?

在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?

C#方法的定义

C#中类。方法。字段 的默认访问修饰符分别是啥?