C# 中是不是有用于多重初始化的语法快捷方式?

Posted

技术标签:

【中文标题】C# 中是不是有用于多重初始化的语法快捷方式?【英文标题】:Is There a Syntax Shortcut for Multiple Initialization in C#?C# 中是否有用于多重初始化的语法快捷方式? 【发布时间】:2011-01-05 07:42:35 【问题描述】:

有没有办法做到这一点:

valueType x = 1, y = 1, z = 1;

字符少? 例如当我有大量状态要初始化为相同的起始值时。 谢谢!

【问题讨论】:

【参考方案1】:

你可以试试

int x, y, z;
x = y = z = 1;

但我看不出它对你有什么帮助......如果你真的有很多变量你必须初始化为相同的东西,你可以考虑使用某种集合:

var myInts = new List<int>();
for (int i = 0; i < 1000; i++)
    myInts.Add(1);

【讨论】:

如果可以的话,我试图避免整个输入 x 两次! 这是 27 个字符 - 比他原来的多 3 个字符,而且我确信其中一些变量的名称比那些示例长得多。 它的可读性比什么都重要,有很多状态。 如果没有隐式变量声明,您将需要输入两次(一次用于声明,一次用于赋值)或以您第一次发布的方式。唯一的选择是:“ int x = y = z = 1; ”这是无效的。 @Bruno,我的应用程序的问题是变量都需要名称,在逻辑上分组,但类型不同(同一组中的所有变量都是相同类型)。我无法通过 State.myVals[i] 访问它们。【参考方案2】:

如果起始值为零并且它们是您的类的成员(不是局部变量),那么您不需要将它们显式初始化为零。

否则,不。

使用数组代替大量参数有意义吗?

【讨论】:

我是这么想的,不,它们不是 0。【参考方案3】:

总的来说,我认为将每个声明分开会更好。它往往使以后更容易改变。

尤其是当大量变量倾向于表明它们应该组合成另一个对象时。

所以我倾向于这样做......

valueType  x = IntialValue;
valueType  y = IntialValue;
valueType  z = IntialValue;

等等……

【讨论】:

通常情况下,我会同意,但在这种情况下,变量代表一个真实世界的对象,它本身非常复杂,拆分它会使维护和训练变得非常困难,我仍然会有多重初始化的问题,随便散了! 如果变量代表一个真实世界的对象,那么将该状态封装到一个对象中。这就是为什么我们称它们为“对象”! :-) 然后你可以在对象的构造函数中初始化它所属的状态。 当然,这就是正在发生的事情!但它仍然需要被初始化为非默认值。这意味着某人()必须做所有的手指工作...... :)【参考方案4】:

假设你所有的“变量”实际上是 POCOfields(普通的旧 CLR 对象,即,除了保存数据之外没有其他用途的对象) .

class State 
    public double pression_top;
    public double pression_bottom;
    /* hundreds and hundres of fields */

在这种情况下,您可以执行以下操作:

var myState = new State();
var t = typeof(State);
foreach (var field in t.GetFields()) 
    field.SetValue(myState, 1);

但请注意,此代码优化,并且对并发不太友好。

【讨论】:

我试试看。在并发成为问题之前,所有初始化都发生在前面。【参考方案5】:

我想添加一个有趣的事实并提醒自己,许多基本原则仍在现代语言中使用。此示例来自“The C Progamming Language”一书(1988 年),在 C# 语言中也有效:

nwhite = nother = 0;
for (i = 0; i < 10; ++i)
    ndigit[i] = 0;

一个很好的例子,展示了如果变量很少,你可以将一个值作为单个表达式分配给变量,如果很多则更好地创建一个集合。

另外,初始化nwhite = nother = 0;可以写成公式:

xval = (yval = (zval = 0));;

因为赋值运算符是右结合的(从右到左执行),我们可以不用括号优雅地编写表达式。

【讨论】:

以上是关于C# 中是不是有用于多重初始化的语法快捷方式?的主要内容,如果未能解决你的问题,请参考以下文章

快捷查询方式

拖放动态创建的快捷方式

C#:快捷方式和模拟

使用静态包装器直接调用无处不在的接口包装类时的快捷方式和建议?

如何在 C# 中使用多个引用编辑快捷方式的目标路径

C#如何保证获取当前应用程序的绝对路径是对的?