Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在仅由构造函数调用的私有方法中指定只读变量的值_C#_Readonly_Private Methods - Fatal编程技术网

C# 在仅由构造函数调用的私有方法中指定只读变量的值

C# 在仅由构造函数调用的私有方法中指定只读变量的值,c#,readonly,private-methods,C#,Readonly,Private Methods,C#编译器给了我以下错误 CS0191:无法将只读字段分配给(构造函数或变量初始值设定项中除外) 我必须将代码(在我的私有函数中)移动到构造函数中吗?听起来很尴尬 请注意,私有方法仅用于由构造函数调用。我希望有某种属性可以用来标记相应的方法。是。您是否尝试过将构造函数链接作为使用公共方法的替代方法 publicStuffClass(字符串a、字符b、整数c) { _a=a; _b=b; _c=c; } public StuffClass(字符串a、字符b) :这(a、b、2) {} 如果要修改,

C#编译器给了我以下错误

CS0191:无法将只读字段分配给(构造函数或变量初始值设定项中除外)

我必须将代码(在我的私有函数中)移动到构造函数中吗?听起来很尴尬


请注意,私有方法仅用于由构造函数调用。我希望有某种属性可以用来标记相应的方法。

是。您是否尝试过将构造函数链接作为使用公共方法的替代方法

publicStuffClass(字符串a、字符b、整数c)
{
_a=a;
_b=b;
_c=c;
}
public StuffClass(字符串a、字符b)
:这(a、b、2)
{}

如果要修改,首先不应将其设置为只读。一旦一个变量是只读的,您就只能在构造函数中修改它,或者在声明时按照错误提示修改它

根据MSDN

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


readonly
成员只能在类级别或其构造函数上分配。这就是使用
readonly
关键字的好处

class Foo
{
    private readonly Foo _foo = new Foo(); // Valid

    public Foo()
    {
        _foo = new Foo(); // Valid
    }

    private void SomeMethod()
    {
        _foo = new Foo(); // Not valid
    }
}

在使用“除
字符串
类以外的类”时,您可以使用
只读
作为
常量
关键字的替代,因为编译器不允许您将
常量
分配给类

只读字段只能由构造函数分配。您可以使用以下方法初始化字段:

class Foo
{
    private readonly Bar _bar = InitializeBar();

    private Bar InitializeBar()
    {
        // Add whatever logic you need to obtain a Foo instance.
        return new Bar();
    }
}
public class Foo
{
    private readonly string _field;

    public Foo(string field)
    {
        Init(out _field, field);
    }

    private static void Init(out string assignTo, string value)
    {
        assignTo = value;
    }
}

不管其他帖子怎么说,实际上有一种(有些不寻常的)方法来实现这一点,并在方法中实际分配值:

class Foo
{
    private readonly Bar _bar = InitializeBar();

    private Bar InitializeBar()
    {
        // Add whatever logic you need to obtain a Foo instance.
        return new Bar();
    }
}
public class Foo
{
    private readonly string _field;

    public Foo(string field)
    {
        Init(out _field, field);
    }

    private static void Init(out string assignTo, string value)
    {
        assignTo = value;
    }
}
示例源自

或者,您也可以从私有方法返回值并在构造函数中赋值,如下所示:

class Foo
{
    private readonly string _field;

    public Foo()
    {
        _field = GetField();
    }

    private string GetField()
    {
        return "MyFieldInitialization";
    }
}
您可以在只读声明中的每个等号前面粘贴“{get;private set;}”,以实现几乎相同的效果(属性现在可以在类中的任何位置设置,不仅在构造函数中,而且至少在类外不可更改)。对于值类型,这是严格正确的,但对于readonly可能具有优势的引用类型,这是不正确的

class Foo
{
    // public readonly MyInt = 30;
    public int MyInt { get; private set; } = 30;
}

私有方法只打算由构造函数调用。我希望有某种属性可以用来标记相应的方法。@tom-我不明白你说的属性是什么意思,但构造函数链接是一种惯用的C#方法,可以实现你所描述的。这是一个很好的提示,但不是op所要求的。这是最接近op问题的解决方案。不过,就我对他的请求的理解而言,他希望该方法只能由构造函数“调用”。但据我所知,这还不可能。