C#中不变的局部值-特定用例

时间:2018-11-09 13:16:24

标签: c# const immutability

我知道以前已经在此讨论过这个通用主题。我感兴趣的是针对我的具体情况是否有好的解决方案:

我有一个这样的命令行工具(简体):

static void Main(string[] args)
{
    if (args.Length < 2)
    {
        Console.WriteLine("Usage: MyTool <InputFolder> <OutputFolder>");
        return;
    }

    string inputFolder = args[0];
    string outputFolder = args[1];

    // ...
}

我为参数值分配名称,以使代码更具可读性。我还想表示这些值以后将不会修改。

constreadonly都不能在这里使用,因为这些值在编译时未知,并且因为它们是局部“变量”而不是类成员。

那么我如何使这段代码更具表现力和可读性?

5 个答案:

答案 0 :(得分:3)

我的主张是创建一个包含变量的类

public class Immutable
{
    public Immutable(string[] args)
    {
         InputFolder = args[0];
         OutputFolder = args[1];
    }
    public readonly string InputFolder;
    public readonly string OutputFolder;
}

然后

var m = new Immutable(args)

答案 1 :(得分:2)

C#7.2 ref readonly怎么样?

get is not exported by node_modules\request\index.js
14:                             uri: API_HOST + url,
15:                         };
16:                         return [4 /*yield*/, request.get(options)];
                                                         ^
17:                     case 1:
18:                         result = _a.sent();

答案 2 :(得分:1)

您可以创建某种Inputs类,在其中您可以将数组解析成其一部分,并使公开解析值的属性变为只读。简单的例子:

public class Inputs {
    private string[] _args;

    public string InputFolder { get { return _args[0]; } }
    public string OutputFolder { get { return _args[1]; } }

    public Inputs(string[] args) { _args = args.Clone(); }

}

答案 3 :(得分:1)

我会做这样的事情:

public class ImmutableObject
{
    public ImmutableObject(string inputFolder, string outputFolder)
    {
        InputFolder = inputFolder;
        OutputFolder = outputFolder;
    }

    public string InputFolder {get;}
    public string OutputFolder {get;}
 }

static void Main(string[] args)
{
    if (args.Length < 2)
    {
        Console.WriteLine("Usage: MyTool <InputFolder> <OutputFolder>");
        return;
    }

    var folders = new ImmutableObject(args[0], args[1]);

    // ...
}

答案 4 :(得分:0)

您正在谈论局部变量。
string已经是不可变的类型。 inputFolderoutputFolder的值永远不会改变。当然,您可以为其分配新的值,但是您处在一个方法中,由于忘记了不为其分配新值,因此该方法应该有多大。

如果要将值传递给其他方法,则它们将作为副本传递,因此方法内发生的操作不会影响inputFolderoutputFolder的实际值。

如果您仍然坚持让那些值不可变,那么考虑使用被设计为不可变的类型。

值元组

(Input string, Output string) folders = (args[0], args[1]);

// Usage
folders.Input
folders.Output  

不可变字典(需要System.Collections.Immutable NuGet包)

var folders = 
    new ImmutableDictionary<string, string>().Add("input", args[0])
                                             .Add("output", args[1]);

// Usage
folders["input"]
folders["output"]