C# C中的常量集属性#

C# C中的常量集属性#,c#,static,constants,C#,Static,Constants,我在一个类中有一个变量,它必须有一个const值 private string query; query的值只能在构造函数调用后设置。该类不是一个静态类,因此不能像通常那样存在变量为静态只读的静态构造函数。我在想,下面这样的事情能实现吗 private string Query { get; const set;} 或 这样我的目标就解决了 或 我可以正常地将变量声明为 private string query; 然后在构造函数中,我可以使变量query在初始化时变为const,即动态地

我在一个类中有一个变量,它必须有一个
const

private string query;
query
的值只能在构造函数调用后设置。该类不是一个
静态
类,因此不能像通常那样存在变量为
静态只读的
静态构造函数
。我在想,下面这样的事情能实现吗

private string Query { get; const set;}

这样我的目标就解决了

我可以正常地将变量声明为

private string query;
然后在构造函数中,我可以使变量
query
在初始化时变为
const
,即动态地

提前感谢您的任何帮助

如果成员变量/字段“在构造函数调用后设置[仅]”,则该变量/字段不能为空。
const
static
set
的上下文中都没有任何意义,并且比readonly的意义更小,readonly仍然不适用于属性

readonly关键字是可以在字段上使用的修饰符。当字段声明包含只读修饰符时,对该声明引入的字段的赋值只能作为声明的一部分或在同一类的构造函数中发生

一种解决方案是使用带有显式支持字段的非自动属性,并通过契约实现只读。其他方法包括使用不同的模式,包括接受构造函数中的值

class Foo {
    // Only allow this to be set ONCE after the constructor, BY CONTRACT
    private string _query;

    // No setter, can't assign "accidently"
    string Query {
        get {
            if (_query == null) throw new InvalidOperationException("Query not set");
            return _query;
        }
        // Or maybe just:
        // get { return _query; }
    }

    // Call later on, BEFORE Query is used - but ONLY call once
    void BindQuery (string query) {
        if (query == null) throw new ArgumentNullException("query");
        if (_query != null) throw new InvalidOperationException("Query already set");
        _query = query;
    }
}
如果成员变量/字段“在构造函数调用后设置[仅]”,则不能对其进行修改。
const
static
set
的上下文中都没有任何意义,并且比readonly的意义更小,readonly仍然不适用于属性

readonly关键字是可以在字段上使用的修饰符。当字段声明包含只读修饰符时,对该声明引入的字段的赋值只能作为声明的一部分或在同一类的构造函数中发生

一种解决方案是使用带有显式支持字段的非自动属性,并通过契约实现只读。其他方法包括使用不同的模式,包括接受构造函数中的值

class Foo {
    // Only allow this to be set ONCE after the constructor, BY CONTRACT
    private string _query;

    // No setter, can't assign "accidently"
    string Query {
        get {
            if (_query == null) throw new InvalidOperationException("Query not set");
            return _query;
        }
        // Or maybe just:
        // get { return _query; }
    }

    // Call later on, BEFORE Query is used - but ONLY call once
    void BindQuery (string query) {
        if (query == null) throw new ArgumentNullException("query");
        if (_query != null) throw new InvalidOperationException("Query already set");
        _query = query;
    }
}
如果成员变量/字段“在构造函数调用后设置[仅]”,则不能对其进行修改。
const
static
set
的上下文中都没有任何意义,并且比readonly的意义更小,readonly仍然不适用于属性

readonly关键字是可以在字段上使用的修饰符。当字段声明包含只读修饰符时,对该声明引入的字段的赋值只能作为声明的一部分或在同一类的构造函数中发生

一种解决方案是使用带有显式支持字段的非自动属性,并通过契约实现只读。其他方法包括使用不同的模式,包括接受构造函数中的值

class Foo {
    // Only allow this to be set ONCE after the constructor, BY CONTRACT
    private string _query;

    // No setter, can't assign "accidently"
    string Query {
        get {
            if (_query == null) throw new InvalidOperationException("Query not set");
            return _query;
        }
        // Or maybe just:
        // get { return _query; }
    }

    // Call later on, BEFORE Query is used - but ONLY call once
    void BindQuery (string query) {
        if (query == null) throw new ArgumentNullException("query");
        if (_query != null) throw new InvalidOperationException("Query already set");
        _query = query;
    }
}
如果成员变量/字段“在构造函数调用后设置[仅]”,则不能对其进行修改。
const
static
set
的上下文中都没有任何意义,并且比readonly的意义更小,readonly仍然不适用于属性

readonly关键字是可以在字段上使用的修饰符。当字段声明包含只读修饰符时,对该声明引入的字段的赋值只能作为声明的一部分或在同一类的构造函数中发生

一种解决方案是使用带有显式支持字段的非自动属性,并通过契约实现只读。其他方法包括使用不同的模式,包括接受构造函数中的值

class Foo {
    // Only allow this to be set ONCE after the constructor, BY CONTRACT
    private string _query;

    // No setter, can't assign "accidently"
    string Query {
        get {
            if (_query == null) throw new InvalidOperationException("Query not set");
            return _query;
        }
        // Or maybe just:
        // get { return _query; }
    }

    // Call later on, BEFORE Query is used - but ONLY call once
    void BindQuery (string query) {
        if (query == null) throw new ArgumentNullException("query");
        if (_query != null) throw new InvalidOperationException("Query already set");
        _query = query;
    }
}

利用这个答案

…你可以

public class MyClass
{
    private readonly _query = new WriteOnce<string>();

    public string Query
    {
        private get { return _query.Value; }
        set { _query.Value = value; }
    }        
}
公共类MyClass
{
private readonly_query=new WriteOnce();
公共字符串查询
{
私有get{return\u query.Value;}
设置{u query.Value=Value;}
}        
}

利用这个答案

…你可以

public class MyClass
{
    private readonly _query = new WriteOnce<string>();

    public string Query
    {
        private get { return _query.Value; }
        set { _query.Value = value; }
    }        
}
公共类MyClass
{
private readonly_query=new WriteOnce();
公共字符串查询
{
私有get{return\u query.Value;}
设置{u query.Value=Value;}
}        
}

利用这个答案

…你可以

public class MyClass
{
    private readonly _query = new WriteOnce<string>();

    public string Query
    {
        private get { return _query.Value; }
        set { _query.Value = value; }
    }        
}
公共类MyClass
{
private readonly_query=new WriteOnce();
公共字符串查询
{
私有get{return\u query.Value;}
设置{u query.Value=Value;}
}        
}

利用这个答案

…你可以

public class MyClass
{
    private readonly _query = new WriteOnce<string>();

    public string Query
    {
        private get { return _query.Value; }
        set { _query.Value = value; }
    }        
}
公共类MyClass
{
private readonly_query=new WriteOnce();
公共字符串查询
{
私有get{return\u query.Value;}
设置{u query.Value=Value;}
}        
}


不使用自动属性,您可以使用一个setter,该setter仅在没有设置的情况下设置值,但这当然意味着您需要一个可以直接设置的备份字段。系统中没有内置功能来处理您需要的内容,您需要自己编写。查看(有时也称为冰棒对象)为什么必须在构造函数之后设置它?这是一个非常奇怪的要求。但非静态类可以有一个静态构造函数。但这真的能解决这个问题吗?@Henkholtman Static只定义所有实例的值是否相同,或者(没有Static)值是否特定于每个实例。只能设置一次值是完全不同的要求。正如他所说,它必须在构造函数之后设置,在任何情况下,我都会排除静态构造函数作为解决方案。这些要求听起来让我很困惑。与使用自动属性不同,你可以使用一个setter,它只在没有设置的情况下设置值,但这当然意味着你需要一个可以直接设置的支持字段。系统中没有内置的功能来处理你需要的内容,你需要自己编写它。查看(有时也称为