`

【原创】ReadOnly和Static构造函数

    博客分类:
  • .NET
阅读更多
先来看一个例子:

    public sealed class DataAccess
    {
        private static readonly DataAccess access =null;

        static DataAccess()
        {
            access = new DataAccess();
        }

        public static DataAccess Instance
        {
            get { return access; }
        }
    }


这里说明两个知识点

Static构造函数:

引用
   1、静态构造函数既没有访问修饰符,也没有参数。
  --因为是.NET调用的,所以像public和private等修饰符就没有意义了。
  2、在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类。
  --也就是说我们无法直接调用静态构造函数,也不可能知道静态构造函数何时会被调用。
  3、一个类只能有一个静态构造函数。
   4、无参数的构造函数可以与静态构造函数共存。
  --尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
  5、最多只运行一次。
  6、静态构造函数不可以被继承。
  7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。


ReadOnly:
引用

只能在下列上下文中对 readonly 字段进行赋值:

当在声明中初始化变量时,例如:

  复制代码
public readonly int y = 5;


对于实例字段,在包含字段声明的类的实例构造函数中;或者,对于静态字段,在包含字段声明的类的静态构造函数中。也只有在这些上下文中,将 readonly 字段作为 out 或 ref 参数传递才有效。

注意
readonly 关键字与 const 关键字不同。const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。另外,const 字段为编译时常数,而 readonly 字段可用于运行时常数,如下例所示:

注意
public static readonly uint l1 = (uint)DateTime.Now.Ticks;


分享到:
评论

相关推荐

    dotnet 谨慎在静态构造函数里使用锁.rar

    在.NET开发中,如果你需要在静态成员中实现线程安全,通常推荐使用静态初始化器(例如,`static readonly`字段的初始化)或者在首次访问静态成员时进行同步,而不是在静态构造函数中。这种方式可以避免潜在的死锁...

    解析C#中的私有构造函数和静态构造函数

    3. **静态类的模拟**:当类中所有方法和字段都是静态的,但不能声明为`static`类(因为`static`类不能有实例成员),可以使用私有构造函数来防止实例化。 **静态构造函数** 静态构造函数是不带访问修饰符和参数的...

    C++ 中 const和static readonly区别

    而 static readonly 则不同,它是在运行时计算出其值的,因此可以通过静态构造函数来赋值。例如:`static readonly MyClass myins = new MyClass();` 这里 `myins` 的值是在运行时计算出其值的,它可以被赋值。 在...

    C#程序设计-3期(KC008) KC008110100018-怎样区别const, static和readonly?.docx

    在C#编程语言中,了解并正确使用`const`、`static`和`readonly`关键字是至关重要的。这些关键字修饰的变量在程序的不同阶段被初始化,并具有不同的作用域和使用方式。下面将详细阐述这三个关键字的区别。 首先,`...

    C#基础:基于const与readonly的深入研究

    如果 `readonly` 字段没有在声明时初始化,那么必须在实例构造函数或静态构造函数中进行初始化。 下面是一些示例来进一步说明这两个关键字: ```csharp public class MyClass { public const int MyConstInt = 42...

    C#编程中 readonly与const的区别

    4. **可以在声明时或构造函数中赋值**:与`const`不同,`readonly`变量的值可以在声明时赋值,也可以在构造函数中赋值。 #### 四、示例对比 下面通过具体的示例来进一步说明`const`和`readonly`之间的区别。 #####...

    c#只读字段和常量的区别,以及静态构造函数的使用实例

    同时,静态构造函数(static constructor)是一种特殊的构造函数,它在类的任何实例创建之前被调用,用于初始化类的静态成员。下面我们将深入探讨这三个概念及其区别。 1. 只读字段(readonly) 只读字段允许在声明...

    c#.net中const和readonly的区别

    readonly 字段可以在对象构造过程中的任何时候(包括声明时和在构造函数中)进行初始化。由于 readonly 字段可以被延迟到运行时初始化,因此它们能够使用来自构造函数或其他变量的值。readonly 是一个实例成员,这...

    面向对象类成员详解

    在类中,成员包括了构造函数、析构函数、方法、常量、字段、属性和索引器等。下面将详细阐述这些概念。 1. **构造函数**:构造函数是用于初始化类的新实例的特殊方法。它必须与类名相同,且没有返回类型。在C#中,...

    C#中const 和 readonly 修饰符的用法详解

    4. readonly可以在申明中初始化,也可以在构造函数中初始化,其它情况不能修改。 namespace const_and_readonly { class Program { static void Main(string[] args) { Console.WriteLine(Half a year have {0} ...

    Object Oriented Programming Using C#(c#面向对象编程基础)

    #### 静态构造函数 (Static Constructors) 静态构造函数用于初始化静态成员。它在类首次被加载到应用程序域时调用一次。例如: ```csharp static FLOWER() { /* 初始化静态成员 */ } ``` #### 析构函数 ...

    设计模式_C#_

    在这个主题中,我们将深入探讨"设计模式_C#",特别是与私有构造函数相关的知识。 首先,私有构造函数(Private Constructor)是类的一个特殊方法,用于初始化对象。当一个类的构造函数被声明为私有时,外部代码无法...

    C#中 const 和 readonly 的不同

    相比之下,`readonly`关键字用于声明一个只读字段,它可以在声明时或者在构造函数中初始化。这意味着`readonly`字段的值可以在运行时确定,可以依赖于其他变量或表达式。例如: ```csharp readonly int myValue; ...

    第五章 C# 编程语言类与对象

    本章详细介绍了C#中的类与对象概念,包括类的实例成员、访问修饰符、构造函数、初始化函数、静态成员、常量和只读字段以及类的继承。通过理解这些概念,开发者能够更好地利用面向对象编程的优势来构建复杂的应用程序...

    c#学习笔记

    静态构造函数只能初始化static变量,而静态只读变量(static readonly)只能在静态构造函数中初始化。 3. **属性(Property)**: 属性提供了一种封装字段的机制,使得数据访问可以控制权限(如只读、只写或两者)...

    C面向对象基础PPT学习教案.pptx

    **类的成员**包括类体内的各种声明,如常数、字段、方法、属性、事件、索引器、运算符、构造函数、析构函数、静态构造函数和类型声明: 1. **常数声明**使用`const`关键字,其修饰符包括`new`、`public`、`...

    C#基础全接触

    static TestClass() // 静态构造函数 { } } ``` #### 基类构造函数调用 子类可以通过使用`base()`关键字来显式调用基类的构造函数。如果没有显式调用,编译器会自动添加一个默认的无参数`base()`调用。 ```...

Global site tag (gtag.js) - Google Analytics