是否获取预制结构的所有值?C#
在C#中,我有一个非常庞大的结构,我想轻松地遍历它,而不是手动键入它们 我尝试使用:是否获取预制结构的所有值?C#,c#,struct,C#,Struct,在C#中,我有一个非常庞大的结构,我想轻松地遍历它,而不是手动键入它们 我尝试使用: Type structType = typeof(myStruct); System.Reflection.FieldInfo[] fields = structType.GetFields(); for(int i=0; i<fields.Length-1; i++) { richTextBox1.Text += fields[i].Name + "\n"; } 那可能吗?使用。更大的结构实际
Type structType = typeof(myStruct);
System.Reflection.FieldInfo[] fields = structType.GetFields();
for(int i=0; i<fields.Length-1; i++)
{
richTextBox1.Text += fields[i].Name + "\n";
}
那可能吗?使用。更大的结构实际上应该是类,因为结构是类
我的建议是编写一些简单的代码生成例程,生成与所需代码相近的代码,并将其复制到剪贴板。然后将其粘贴到您的程序中,并进行所需的任何小调整 必须编写大量样板代码通常意味着在所做的工作或所使用的语言/框架中存在设计缺陷。根据你正在做的事情,错误可能在前者或后者 存在适合大型结构的情况;如果假定某一类型的每个变量都封装了一个固定的独立值集合,那么一个公开的字段结构就可以完美地表达这一点。在事情开始变得如此之大以至于产生堆栈溢出的风险之前,支持使用4字段结构而不是4字段类的因素对于20字段结构和20字段类将更加重要 使用结构编程和使用类编程之间有一些明确的区别。如果使用不可变的类,那么从类实例生成一个除了几个字段之外完全相同的新实例是很困难的。如果使用可变类,则很难确保每个变量都封装自己的一组独立值。假设有一个
列表myList
,并且myList[0]
包含一个X
为3的实例。希望myList[0]
保存X
为4的实例,但不影响与类型为classWithPropertyX
的任何其他变量或存储位置关联的X
属性的值
可能正确的方法是
myList[0].X = 4;
但这可能会产生不必要的副作用。也许我们需要使用
myList[0] = myList[0].WithX(4);
或许
var temp = myList[0];
myList[0] = new classWithPropertyX(temp.this, 4, temp.that, temp.theOther, etc.);
人们可能需要检查大量代码,以确定哪种技术是合适的。相比之下,如果有列表myList
,则正确的代码是:
var temp = myList[0];
temp.X = 4;
myList[0] = temp;
人们需要知道的唯一正确方法是,
structWithExposedFieldX
是一个具有公开公共字段的结构X
您可能希望使用StringBuilder
或lambda语句为RichTextBox
构建字符串。目前来看,这个例子是一个低效的实现。小心——你是在按字段装箱——对于一个有很多字段的胖结构来说这是一个非常糟糕的主意/cc@userMSDN,不管出于什么原因,都没有提到结构有两种不同的使用情况,例如Decimal
和Drawing.Point
;封装单个逻辑值的对象应该是小结构或不可变类。封装一组固定的独立值(例如,点的坐标)的东西应该是暴露的字段结构,不管需要什么大小来容纳它们。坦率地说,这不应该是一个结构。这里的一切都是错误的:它太大了,它是可变的,并且它有公共字段。这是一个很大的错误——通常是c/c++开发人员在c#中犯的错误——我猜对了吗?@MarcGravel他现在可能已经走了。@Romoku也许他们回来询问他们的内存问题时会注意到评论…@MarcGravel:一个公开的字段结构是一组固定的独立变量,用管道胶带绑在一起,这样他们就可以可以单独使用,也可以作为一个大变量使用。如果一个Foo
类型的变量需要封装一组固定的离散值,并且如果一个变量需要能够将所有值从一个变量复制到另一个变量,并且能够更改变量中的一个值,那么一个公开的字段结构将满足这两个需求。是否有一些我不知道的模式可以用来编写能够很好地完成这两个操作的类?我所知道的唯一模式……允许一个人选择其中一个操作来提高效率,但另一个操作却非常笨拙。变量封装的独立值越多,操作就越不方便。结构不是类对象,必须以不同于类对象的方式使用,但在封装一组固定值的结构比类对象具有优势的情况下,这些优势通常会随着大小而增加,除非事情变得非常大(超过4K左右)。
var temp = myList[0];
myList[0] = new classWithPropertyX(temp.this, 4, temp.that, temp.theOther, etc.);
var temp = myList[0];
temp.X = 4;
myList[0] = temp;