Tag: C#的

有没有一种方法只在C#中设置属性

我正在寻找一种方法来允许C#对象中的属性只能设置一次。 编写代码很容易,但我宁愿使用标准的机制(如果存在的话)。 public OneShot <int> SetOnceProperty {get; 组; } 我想要发生的是该属性可以设置,如果它尚未设置,但抛出一个例外,如果它已经被设置之前。 它应该像一个Nullable值,我可以检查,看看它是否已经设置或不。

如何防止GCC优化出一个繁忙的等待循环?

我想为Atmel AVR微控制器编写一个C代码固件。 我将使用GCC进行编译。 另外,我想启用编译器优化( -Os或-O2 ),因为我没有理由不启用它们,并且它们可能会比手动编写汇编产生更好的汇编方式。 但是我想要一小段代码没有优化。 我想推迟一段时间的函数执行,因此我想写一个什么都不做的循环,只是浪费一些时间。 不需要精确,只需等待一段时间。 /* How to NOT optimize this, while optimizing other code? */ unsigned char i, j; j = 0; while(–j) { i = 0; while(–i); } 由于AVR中的内存访问速度要慢很多,所以我希望将i和j保存在CPU寄存器中。 更新:我刚刚从AVR Libc发现util / delay.h和util / delay_basic.h 。 虽然大多数时候使用这些函数可能是一个更好的主意,但这个问题仍然有效且有趣。

makefiles – 一次编译所有的c文件

我想尝试GCC整个程序的优化。 为此,我必须一次将所有的C文件传递给编译器前端。 然而,我使用makefile来自动化我的构build过程,而且在makefile魔术方面我不是专家。 如果我想使用一次调用GCC来编译(甚至可能是链接),我应该如何修改makefile? 作为参考 – 我的makefile看起来像这样: LIBS = -lkernel32 -luser32 -lgdi32 -lopengl32 CFLAGS = -Wall OBJ = 64bitmath.o \ monotone.o \ node_sort.o \ planesweep.o \ triangulate.o \ prim_combine.o \ welding.o \ test.o \ main.o %.o : %.c gcc -c $(CFLAGS) $< -o $@ test: $(OBJ) gcc -o $@ $^ $(CFLAGS) $(LIBS)

使用枚举作为数组索引

我有这个枚举: enum ButtonState { BUTTON_NORMAL = 0, BUTTON_PRESSED = 1, BUTTON_CLICKED = 2 }; const u8 NUM_BUTTON_STATES = 3; 在我的Button类中,我有成员variablesButtonState state; 和ButtonColors colors[NUM_BUTTON_STATES]; 。 在绘制button时,我使用colors[state]来获取button所处状态的颜色。 我的问题: 这是不错的编程风格? 有没有更好的方法来做到这一点? (我通常只使用开关语句枚举…使用枚举作为数组索引感觉不对。) 我必须指定枚举的值吗? 它似乎从默认情况下从0开始,并增加1,但它是保证在所有编译器中以这种方式工作?

C#与IEnumerable <T>不同的自定义IEqualityComparer

这是我想要做的。 我正在使用LINQ to XML查询XML文件,这给了我一个IEnumerable <T >对象,其中T是我的“Village”类,充满了这个查询的结果。 一些结果是重复的,所以我想对IEnumerable对象执行Distinct(),就像这样: public IEnumerable<Village> GetAllAlliances() { try { IEnumerable<Village> alliances = from alliance in xmlDoc.Elements("Village") where alliance.Element("AllianceName").Value != String.Empty orderby alliance.Element("AllianceName").Value select new Village { AllianceName = alliance.Element("AllianceName").Value }; // TODO: make it work… return alliances.Distinct(new AllianceComparer()); } catch (Exception ex) { throw new Exception("GetAllAlliances", ex); } } 由于缺省比较器不适用于Village对象,因此我实现了一个自定义比较器,如在AllianceComparer类中所示: public […]

比memset更快的零内存方式?

我了解到, memset(ptr, 0, nbytes)非常快,但有没有更快的方法(至less在x86上)? 我认为,memset使用mov ,但是当调零内存大多数编译器使用xor因为它更快,正确吗? 编辑1:错误,正如GregS指出的那样,只适用于寄存器。 我在想什么? 另外我问了一个比我更了解汇编程序的人去看stdlib,他告诉我在x86上memset没有充分利用32位宽的寄存器。 然而当时我很累,所以我不太确定我是否正确理解。 编辑2 :我重新审视这个问题,并做了一些testing。 这是我testing的: #include <stdio.h> #include <malloc.h> #include <string.h> #include <sys/time.h> #define TIME(body) do { \ struct timeval t1, t2; double elapsed; \ gettimeofday(&t1, NULL); \ body \ gettimeofday(&t2, NULL); \ elapsed = (t2.tv_sec – t1.tv_sec) * 1000.0 + (t2.tv_usec – t1.tv_usec) / 1000.0; \ […]

在方法中使用const而不是variables的优点

每当我有方法中的局部variables,ReSharperbuild议将它们转换为常量: // instead of this: var s = "some string"; var flags = BindingFlags.Public | BindingFlags.Instance; // ReSharper suggest to use this: const string s = "some string"; const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance; 鉴于这些是真正的恒定值(而不是variables),我明白,ReSharperbuild议将它们改为const。 但除此之外,使用const(例如更好的性能),还有什么其他的优势,certificate使用const BindingFlags而不是方便可读的var关键字吗? 顺便说一句:我只是在这里find一个类似的问题: Resharper总是build议我做conststring,而不是string ,但我认为这是关于一个类的领域,我的问题是关于局部variables/常量。

通用枚举的C#非装箱转换为int?

给定一个通用参数TEnum,它总是一个枚举types,有没有什么办法从TEnum强制转换为int,而不是装箱/拆箱? 看到这个示例代码。 这将不必要地打开/取消装箱值。 private int Foo<TEnum>(TEnum value) where TEnum : struct // C# does not allow enum constraint { return (int) (ValueType) value; } 上面的C#是释放模式编译为以下IL(注意装箱和拆箱操作码): .method public hidebysig instance int32 Foo<valuetype .ctor ([mscorlib]System.ValueType) TEnum>(!!TEnum 'value') cil managed { .maxstack 8 IL_0000: ldarg.1 IL_0001: box !!TEnum IL_0006: unbox.any [mscorlib]System.Int32 IL_000b: ret } SO的转换已经被广泛的处理,但是我找不到针对这个具体情况的讨论。

`const auto`有什么意义?

我觉得这个问题很清楚。 auto关键字会自动检测常量,或者总是返回非consttypes,即使存在例如。 两个版本的函数(一个返回const ,另一个不返回)。 只是为了logging,我在我的for循环之前使用const auto end = some_container.end() ,但是我不知道这是否是必要的,甚至不同于普通的auto 。

在kernel.h的minmacros中,“(void)(&_min1 ==&_min2)”的function是什么?

在kernel.h中, min被定义为: #define min(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2); \ _min1 < _min2 ? _min1 : _min2; }) 我不明白是什么行(void) (&_min1 == &_min2); 确实。 是某种types的检查或什么?