我知道以前已经在此讨论过这个通用主题。我感兴趣的是针对我的具体情况是否有好的解决方案:
我有一个这样的命令行工具(简体):
static void Main(string[] args)
{
if (args.Length < 2)
{
Console.WriteLine("Usage: MyTool <InputFolder> <OutputFolder>");
return;
}
string inputFolder = args[0];
string outputFolder = args[1];
// ...
}
我为参数值分配名称,以使代码更具可读性。我还想表示这些值以后将不会修改。
const
和readonly
都不能在这里使用,因为这些值在编译时未知,并且因为它们是局部“变量”而不是类成员。
那么我如何使这段代码更具表现力和可读性?
答案 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
已经是不可变的类型。 inputFolder
和outputFolder
的值永远不会改变。当然,您可以为其分配新的值,但是您处在一个方法中,由于忘记了不为其分配新值,因此该方法应该有多大。
如果要将值传递给其他方法,则它们将作为副本传递,因此方法内发生的操作不会影响inputFolder
和outputFolder
的实际值。
如果您仍然坚持让那些值不可变,那么考虑使用被设计为不可变的类型。
值元组
(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"]