生成只读本地字符串C#

生成只读本地字符串C#,c#,.net,string,encapsulation,protection,C#,.net,String,Encapsulation,Protection,我有一个本地字符串(文件路径),我只需要从函数中检索一次,我想确保它不再被修改。我不能使用const关键字,因为字符串的值是在运行时而不是编译时确定的。因此,我尝试改用readonly关键字,但Visual Studio告诉我该关键字对我的项目无效。我如何才能达到我想要的保护级别,最好是不进行其他分类 为了简单和公司政策,我(彻底)缩小并重命名了我的类和函数,但概念是一样的 public class myClass { private void myFunction() {

我有一个本地字符串(文件路径),我只需要从函数中检索一次,我想确保它不再被修改。我不能使用
const
关键字,因为字符串的值是在运行时而不是编译时确定的。因此,我尝试改用
readonly
关键字,但Visual Studio告诉我该关键字对我的项目无效。我如何才能达到我想要的保护级别,最好是不进行其他分类

为了简单和公司政策,我(彻底)缩小并重命名了我的类和函数,但概念是一样的

public class myClass
{
    private void myFunction()
    {
      readonly string filePath = HelperClass.getFilePath("123");

     //do stuff
    }
}

public static class HelperClass
{ 
    public static string getFilePath(string ID)
    {
        switch(ID)
        {
             case "123":
                 return "C:/123.txt";

             case "234":
                 return "C:/234.txt";

             default:
                 throw new Exception(ID + " is not supported");
        }
    }
}
==为PS2Goat编辑====

public class myClass
{
    protected SomeObject o;
    private virtual readonly string path;        

    public myClass(someObject o)
    {
        this.o = o;
        path = HelperClass.getFilePath(o.getID());
    }

    private virtual void myFunction()
    { 

     //do stuff
    }
}

public class myDerivedClass
{
    private override virtual readonly string path;        

    public myDerivedClass(someObject o) : base(o)
    {
        path = HelperClass.getFilePath(o.getID()); //ID will be different
    }

    private override void myFunction()
    { 

     //do different stuff
    }
}





public static class HelperClass
{ 
    public static string getFilePath(string ID)
    {
        switch(ID)
        {
             case "123":
                 return "C:/123.txt";

             case "234":
                 return "C:/234.txt";

             default:
                 throw new Exception(ID + " is not supported");
        }
    }
}

看,我遇到的这个问题是,如果我想抛出一个异常,我现在必须在父类的构造函数中捕获它(直到该类被支持),因为父构造函数将在派生构造函数之前被调用。因此,在调用子构造函数(具有正确的ID)之前,将设置一次错误的ID。

文件路径
变量升级为字段,这将修复错误。局部变量不能是只读的

public class myClass
{
      readonly string filePath = HelperClass.getFilePath("123");
}

filePath
变量升级为字段,这将修复错误。局部变量不能是只读的

public class myClass
{
      readonly string filePath = HelperClass.getFilePath("123");
}

readonly
表示只能在类构造函数或instantiation中设置它。因此,您可以将逻辑更改为以下内容:

public class myClass
{
    private readonly string _filePath;

    public myClass()
    {
        _filePath = HelperClass.getFilePath("123");
    }

    private void myFunction()
    {
      // Use your _filePath here...

     //do stuff
    }
}

public static class HelperClass
{ 
    public static string getFilePath(string ID)
    {
        switch(ID)
        {
             case "123":
                 return "C:/123.txt";

             case "234":
                 return "C:/234.txt";

             default:
                 throw new Exception(ID + " is not supported");
        }
    }
}

readonly
表示只能在类构造函数或instantiation中设置它。因此,您可以将逻辑更改为以下内容:

public class myClass
{
    private readonly string _filePath;

    public myClass()
    {
        _filePath = HelperClass.getFilePath("123");
    }

    private void myFunction()
    {
      // Use your _filePath here...

     //do stuff
    }
}

public static class HelperClass
{ 
    public static string getFilePath(string ID)
    {
        switch(ID)
        {
             case "123":
                 return "C:/123.txt";

             case "234":
                 return "C:/234.txt";

             default:
                 throw new Exception(ID + " is not supported");
        }
    }
}

只需将要声明的
readonly
变量移到函数定义之外即可

public class myClass
    {
        readonly string filePath = HelperClass.getFilePath("123");

        private void myFunction()
        {

         //do stuff with filePath
        }
    }

只需将要声明的
readonly
变量移到函数定义之外即可

public class myClass
    {
        readonly string filePath = HelperClass.getFilePath("123");

        private void myFunction()
        {

         //do stuff with filePath
        }
    }

由于这是一个变量,而不是字段或属性,因此不能将其标记为只读。但是,您可以通过使用匿名类型“欺骗”并实现您想要的,匿名类型确保其属性是只读的

例如:

    var data = new
    {
        FileName = HelperClass.getFilePath("123");
    };

由于这是一个变量,而不是字段或属性,因此不能将其标记为只读。但是,您可以通过使用匿名类型“欺骗”并实现您想要的,匿名类型确保其属性是只读的

例如:

    var data = new
    {
        FileName = HelperClass.getFilePath("123");
    };

不能在方法中设置只读变量的作用域。因此,应将其提升为
只读静态
字段:

public class myClass
{
    private readonly static string filePath = HelperClass.getFilePath("123");
    private void myFunction()
    {    
      //do stuff
    }
}
这将导致您的
filePath
变量在首次访问
myClass
时被初始化。如果这不是您想要的,
getFilePath
是一个长时间运行/代价高昂的操作,并且您希望等待调用
myFunction
,您可以用
System.Lazy
替换实现:

公共类myClass
{
私有只读静态惰性文件路径
=newlazy(()=>HelperClass.getFilePath(“123”));
私有函数()
{   
字符串路径=filePath.Value;
//做事
}
}

方法中不能有只读变量的作用域。因此,应将其提升为
只读静态
字段:

public class myClass
{
    private readonly static string filePath = HelperClass.getFilePath("123");
    private void myFunction()
    {    
      //do stuff
    }
}
这将导致您的
filePath
变量在首次访问
myClass
时被初始化。如果这不是您想要的,
getFilePath
是一个长时间运行/代价高昂的操作,并且您希望等待调用
myFunction
,您可以用
System.Lazy
替换实现:

公共类myClass
{
私有只读静态惰性文件路径
=newlazy(()=>HelperClass.getFilePath(“123”));
私有函数()
{   
字符串路径=filePath.Value;
//做事
}
}


您不能在getter/setter中有一个带有逻辑的属性来防止或限制重新输入吗?字符串是不可变的,因此如果您没有将任何其他字符串实例分配给
文件路径
变量,我会考虑声明一个
readonly
属性,并在构造函数(或类型构造函数)中只初始化它一次,但前提是
getFilePath
方法不需要太多时间time@Yuriy是的,但我想让其他程序员很难修改值,它不应该在my函数的范围内被修改。除了标记的duplicate see之外。你不能在getter/setter中有一个带有逻辑的属性来防止或限制重新进入吗?字符串是不可变的,因此如果你没有为
filePath
变量分配任何其他字符串实例,我会考虑声明一个
readonly
属性,并在构造函数(或类型构造函数)中只初始化它一次,但前提是
getFilePath
方法不需要太多时间time@Yuriy是的,但我想让其他程序员很难修改值,它不应该在我的功能范围内被修改。除了标记的副本外,请参阅。嗯。。。你的代码和他说的不起作用的问题是一样的。将其设置为可写字段并不能解决问题,因为他只希望它在为空时可编辑。不,这与他说的不起作用的问题不同。他将其提升为字段,而不是问题中的局部变量。@siva.k我的代码与Op的代码不同,您可能需要仔细阅读。这会有用的。嗯。。。你的代码和他说的不起作用的问题是一样的。将其设置为可写字段并不能解决问题,因为他只希望它在为空时可编辑。不,这与他说的不起作用的问题不同。他将其提升为字段,而不是问题中的局部变量。@siva.k我的代码与Op的代码不同,您可能需要仔细阅读。这不仅在构造函数中有效。它只能在Instant期间设置