Tag: C#的

为什么我应该使用var而不是一个types?

可能重复: ReSharper和var 在我安装了ReSharper后,它要求(通过警告),例如,我尽可能使用var UnhandledExceptionEventArgs ue = (UnhandledExceptionEventArgs) t; ReSharper想把它变成 var ue = (UnhandledExceptionEventArgs) t; 我喜欢第一个版本更好,是否有任何理由更喜欢var ? 更好的性能? 什么? 还是只是一种代码风格?

无论结果如何,支持除零的最快整数除法是什么?

概要: 我正在寻找最快的方法来计算 (int) x / (int) y 没有得到y==0的exception。 相反,我只是想要一个任意的结果。 背景: 在对image processingalgorithm进行编码时,我经常需要除以(累加的)alpha值。 最简单的变体是整数算术的纯C代码。 我的问题是,我通常得到一个由零错误除alpha==0结果像素alpha==0 。 然而,这正是结果完全不重要的像素:我不关心alpha==0像素的颜色值。 细节: 我正在寻找像这样的东西: result = (y==0)? 0 : x/y; 要么 result = x / MAX( y, 1 ); x和y是正整数。 代码在嵌套循环中执行了很多次,所以我正在寻找一种方法来摆脱条件分支。 当y不超过字节范围时,我对解决scheme感到满意 unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, […] 255 }; […] result = […]

哪个更好,返回值还是输出参数?

如果我们想从一个方法中获得一个值,我们可以使用如下的返回值: public int GetValue(); 要么: public void GetValue(out int x); 我不是很了解他们之间的差异,所以不知道哪个更好。 你能解释一下吗? 谢谢。

什么使一个方法线程安全? 规则是什么?

是否有什么使方法线程安全的总体规则/准则? 我知道可能有一百万次的一次性情况,但是一般情况呢? 这是简单的吗? 如果一个方法只访问局部variables,它是线程安全的。 是吗? 这也适用于静态方法吗? @Cybis提供的一个答案是: 局部variables不能在线程间共享,因为每个线程都有自己的栈。 这是静态方法的情况呢? 如果一个方法传递一个引用对象,那么这是否会破坏线程的安全性? 我已经做了一些研究,并且在某些情况下有很多,但是我希望能够通过使用一些规则来定义遵循的准则,以确保方法是线程安全的。 所以,我想我的最终问题是:“是否有一个定义线程安全方法的规则列表?如果是,它们是什么? 编辑 这里有很多好的一点。 我想这个问题的真正答案是:“确保线程安全没有简单的规则。” 凉。 精细。 但总的来说,我认为接受的答案提供了一个好的,简短的总结。 总有例外。 就这样吧。 我可以忍受这一点。

LLVM vs OSX上的clang

我在OS X上有一个关于llvm,clang和gcc的问题。 llvm-gcc 4.2,llvm 2.0和clang有什么区别? 我知道他们都是基于llvm,但他们又有什么不同呢? 除了更快的编译之外,llvm比gcc还有什么优势呢?

获取枚举的最大值

你如何得到一个枚举的最大值?

g ++ -Wreorder有什么意义?

g ++ -Wall选项包括-Wreorder。 下面介绍这个选项的作用。 我不明白为什么有人会关心(特别是在-Wall中默认打开这个function)。 -Wreorder(仅限C ++) 警告代码中给出的成员初始值设定项的顺序不是 匹配他们必须执行的顺序。 例如: struct A { int i; int j; A():j(0),i(1){} }; 编译器将重新排列i和j的成员初始值设定项 匹配成员的声明顺序,发出警告 影响。 此警告由-Wall启用。

如何可靠地确定在devise时使用var声明的variables的types?

我正在为emacs中的C#完成(intellisense)工具。 这个想法是,如果用户键入一个片段,然后通过特定的按键组合来请求完成,完成工具将使用.NETreflection来确定可能的完成。 这样做需要知道正在完成的事物的types。 如果它是一个string,则有一组已知的可能的方法和属性; 如果它是一个Int32,它有一个单独的集合,依此类推。 使用语义,emacs中可用的代码词法分析器/parsing器包,我可以findvariables声明及其types。 鉴于此,使用reflection来获取types的方法和属性是很简单的,然后向用户提供选项列表。 (好吧, 在 emacs 里面做的不是很简单 ,但是使用在 emacs 里面运行powershell的过程变得容易多了,我写了一个自定义的.NET程序集来做reflection,把它加载到powershell中,然后在内部运行elisp emacs可以通过comint向powershell发送命令并读取响应,因此emacs可以快速得到reflection结果。) 当代码在正在完成的事情的声明中使用var时,问题就到了。 这意味着types没有明确指定,完成将不起作用。 如何用var关键字声明variables时,如何可靠地确定实际使用的types? 只是要清楚,我不需要在运行时确定它。 我想在“devise时间”确定它。 到目前为止,我有这些想法: 编译和调用: 提取声明语句,例如`var foo =“一个string值”;` 连接一个语句`foo.GetType();` 将生成的C#片段dynamic编译成一个新的程序集 将程序集加载到一个新的AppDomain中,运行framgment并获取返回types。 卸载并丢弃程序集 我知道如何做到这一切。 但是,对于编辑器中的每个完成请求,它听起来都非常重量级。 我想我每次都不需要一个新的AppDomain。 我可以重复使用一个AppDomain来处理多个临时程序集,并在多个完成请求中分摊设置和分解的成本。 这更多的是对基本想法的调整。 编译和检查IL 简单地将声明编译成模块,然后检查IL,以确定编译器推断的实际types。 这怎么可能? 我会用什么来检查IL? 有更好的想法吗? 注释? build议? 编辑 – 进一步思考,编译和调用是不可接受的,因为调用可能有副作用。 所以必须排除第一个选项。 另外,我想我不能假定.NET 4.0的存在。 更新 – 上面没有提到的正确答案,但Eric Lippert轻声指出,是实现一个完全保真types推断系统。 它是在devise时可靠地确定variablestypes的唯一方法。 但是,这也不容易。 因为我不想有任何幻想想要尝试构build这样的事情,所以我select了选项2的快捷方式 – […]

你把unit testing放在同一个项目还是另一个项目?

你为了方便把unit testing放在同一个项目中,还是把它们放在一个单独的程序集中? 如果像我们这样将它们放在一个单独的程序集中,那么解决scheme中会包含一些额外的项目。 在编写代码的unit testing中很棒,但是如何在没有所有这些额外程序集的情况下释放应用程序呢?

如何删除OR'd枚举的项目?

我有一个枚举像: public enum Blah { RED = 2, BLUE = 4, GREEN = 8, YELLOW = 16 } Blah colors = Blah.RED | Blah.BLUE | Blah.YELLOW; 我怎样才能从variables的颜色去除蓝色?