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】:假设你所有的“变量”实际上是 POCO 的 fields(普通的旧 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# 中是不是有用于多重初始化的语法快捷方式?的主要内容,如果未能解决你的问题,请参考以下文章