C# 设置一个常量对象变量';s场

C# 设置一个常量对象变量';s场,c#,C#,我正在创建一个类来对整个应用程序中使用的所有常量变量进行分组,并有两个PictureBox类型的对象变量 例如: public const PictureBox availablePic = new PictureBox(); public const PictureBox unavailablePic = new PictureBox(); 但是如果我将它们声明为常量,那么我必须将它们设置为整个应用程序中的值,这就是我希望对Image属性所做的 所以我的问题是,我该如何在声明时声明对象类型常

我正在创建一个类来对整个应用程序中使用的所有常量变量进行分组,并有两个PictureBox类型的对象变量

例如:

public const PictureBox availablePic = new PictureBox();
public const PictureBox unavailablePic = new PictureBox();
但是如果我将它们声明为常量,那么我必须将它们设置为整个应用程序中的值,这就是我希望对Image属性所做的

所以我的问题是,我该如何在声明时声明对象类型常量的属性


我主要是一名Java程序员,所以我正在寻找如何在C#中以正确的方式实现这一点。

使用
只读
关键字,它只允许一个赋值,例如

public readonly PictureBox availablePic = new PictureBox() {
  // Put all required properties here
  BackColor = Color.AliceBlue,
  BorderStyle = BorderStyle.FixedSingle,
  ...
};

public readonly PictureBox unavailablePic = new PictureBox();

使用只允许一次赋值的
readonly
关键字,例如

public readonly PictureBox availablePic = new PictureBox() {
  // Put all required properties here
  BackColor = Color.AliceBlue,
  BorderStyle = BorderStyle.FixedSingle,
  ...
};

public readonly PictureBox unavailablePic = new PictureBox();

您需要使用
readonly
,而不是
const
,因为您希望分配非编译时文本的内容。要初始化数据,有几个选项:

  • 使用对象初始值设定项:

    public static readonly PictureBox box = new PictureBox() { Value = "sample" };
    
  • 使用静态方法初始化对象:

    public static readonly PictureBox box = CreatePicturebox();
    
    public static PictureBox CreatePicturebox()
    {
        PictureBox box = new PictureBox();
        box.Value = "sample";
        return box;
    }
    
  • 使用静态构造函数

    public class Foo
    {
        public static readonly PictureBox box;
    
        static Foo()
        {
            box = new PictureBox();
            box.Value = "sample";
        }
    }
    

  • 还要记住,如果
    PictureBox
    是一种可变类型,那么将此字段设置为只读仅意味着引用永远不能更改为引用另一个对象。这并不意味着对象本身不能变异。如果这是您的意图,您将希望使对象不可变,或者提供一个不可变的包装器,该包装器就是您公开的对象。

    您需要使用
    只读
    ,而不是
    常量
    ,因为您希望分配的内容不是编译时文本。要初始化数据,有几个选项:

  • 使用对象初始值设定项:

    public static readonly PictureBox box = new PictureBox() { Value = "sample" };
    
  • 使用静态方法初始化对象:

    public static readonly PictureBox box = CreatePicturebox();
    
    public static PictureBox CreatePicturebox()
    {
        PictureBox box = new PictureBox();
        box.Value = "sample";
        return box;
    }
    
  • 使用静态构造函数

    public class Foo
    {
        public static readonly PictureBox box;
    
        static Foo()
        {
            box = new PictureBox();
            box.Value = "sample";
        }
    }
    

  • 还要记住,如果
    PictureBox
    是一种可变类型,那么将此字段设置为只读仅意味着引用永远不能更改为引用另一个对象。这并不意味着对象本身不能变异。如果这是您的意图,您可能希望使对象不可变,或者提供一个公开的不可变包装器。

    您不能使用可变引用类型(即
    PictureBox
    )。您可以使用
    只读
    ,但在这种情况下,引用将是只读的。没有什么可以阻止客户端更改被引用对象的属性(这会影响具有相同引用的所有其他客户端)

    无法创建无法更改的PictureBox。如果要返回“常量”图像,请将其设置为只读。您还可以提供只读属性,将新的
    PictureBox
    引用集返回到“常量”图像。这样,如果客户端更改了一个
    PictureBox
    ,其他客户端将不受影响

    private readonly Image availablePic ;
    private readonly Image unavailablePic ;
    
    // initialize images in static constructor
    
    public static PictureBox UnavailablePic
    {
       get{
           return new PictureBox {Image = unavailablePic};
       }
    }
    
    public static PictureBox AvailablePic
    {
       get{
           return new PictureBox {Image = availablePic};
       }
    }
    

    使用可变引用类型(即
    PictureBox
    是)无法做到这一点。您可以使用
    只读
    ,但在这种情况下,引用将是只读的。没有什么可以阻止客户端更改被引用对象的属性(这会影响具有相同引用的所有其他客户端)

    无法创建无法更改的PictureBox。如果要返回“常量”图像,请将其设置为只读。您还可以提供只读属性,将新的
    PictureBox
    引用集返回到“常量”图像。这样,如果客户端更改了一个
    PictureBox
    ,其他客户端将不受影响

    private readonly Image availablePic ;
    private readonly Image unavailablePic ;
    
    // initialize images in static constructor
    
    public static PictureBox UnavailablePic
    {
       get{
           return new PictureBox {Image = unavailablePic};
       }
    }
    
    public static PictureBox AvailablePic
    {
       get{
           return new PictureBox {Image = availablePic};
       }
    }
    

    如注释中所示,对于任何非原语的变量,
    const
    关键字将不起作用。相反,您可以使用
    静态
    只读
    关键字的组合

    要初始化它们,请使用它们的构造函数、对象初始值设定项或向类中添加静态构造函数。考虑到您对对象的选择,静态构造函数可能是最好的。静态构造函数的工作方式与对象构造函数类似,但在第一次使用类时只运行一次。它们专门用于初始化静态组件

    要声明一个,请(再次)在看起来像无参数构造函数的前面使用
    static
    关键字。例如:
    static MyClass()

    因此,您的代码可能类似于:

    class MyClass
    {
       public static readonly PictureBox availablePic = new PictureBox();
       public static readonly PictureBox unavailablePic = new PictureBox();
    
       static MyClass()
       {
          // Initialize the picture boxes here.
          availablePic.Image = Image.FromFile("available.png");
       }
    
    ...
    }
    

    如注释中所示,对于任何非原语的变量,
    const
    关键字将不起作用。相反,您可以使用
    静态
    只读
    关键字的组合

    要初始化它们,请使用它们的构造函数、对象初始值设定项或向类中添加静态构造函数。考虑到您对对象的选择,静态构造函数可能是最好的。静态构造函数的工作方式与对象构造函数类似,但在第一次使用类时只运行一次。它们专门用于初始化静态组件

    要声明一个,请(再次)在看起来像无参数构造函数的前面使用
    static
    关键字。例如:
    static MyClass()

    因此,您的代码可能类似于:

    class MyClass
    {
       public static readonly PictureBox availablePic = new PictureBox();
       public static readonly PictureBox unavailablePic = new PictureBox();
    
       static MyClass()
       {
          // Initialize the picture boxes here.
          availablePic.Image = Image.FromFile("available.png");
       }
    
    ...
    }
    

    如果您公开PictureBox,则消费代码可以更改其图像。没办法。如果要显示PictureBox而不让消费代码访问其Image属性,您唯一的方法是将其封装在您自己的自定义控件中。

    如果您公开PictureBox,消费代码可以更改其图像。没办法。如果要显示PictureBox而不让消费代码访问其图像属性,您唯一的方法是将其封装在您自己的自定义控件中。

    const
    仅适用于文本(例如
    1
    “foo”
    )。您需要的是
    static readonly
    ,它标记类型可以访问的字段,并且引用不可修改。(我会使用
    图像
    而不是
    图片盒
    ,因为
    图片盒
    是一个w