Tag: C#的

在C ++中扩展枚举?

有没有在C + +的方式来扩展/“inheritance”枚举? IE: enum Enum {A,B,C}; enum EnumEx : public Enum {D,E,F}; 或至less定义它们之间的转换?

自定义EventHandler与EventHandler <EventArgs>

最近我一直在想这个代码之间是否有任何显着的区别: public event EventHandler<MyEventArgs> SomeEvent; 和这个: public delegate void MyEventHandler(object sender, MyEventArgs e); public event MyEventHandler SomeEvent; 他们都做同样的事情,我没有能够说出任何的区别。 尽pipe我已经注意到.NET Framework的大多数类都使用自定义事件处理程序委托来处理事件。 这是否有特定的原因?

是调用一个“空”参考(即没有用户事件)的扩展方法邪恶?

邪恶还是不邪恶? public static void Raise(this EventHandler handler, object sender, EventArgs args) { if (handler != null) { handler(sender, args); } } // Usage: MyButtonClicked.Raise(this, EventArgs.Empty); // This works too! Evil? EventHandler handler = null; handler.Raise(this, EVentArgs.Empty); 请注意,由于扩展方法的性质,如果MyButtonClicked为null,MyButtonClicked.Raise不会抛出NullReferenceException。 (例如没有MyButtonClicked事件的监听器)。 邪恶还是不?

严重的错误与int提升/可空转换,允许从十进制转换

我认为这个问题会使我立即在Stack Overflow上成名。 假设你有以下types: // represents a decimal number with at most two decimal places after the period struct NumberFixedPoint2 { decimal number; // an integer has no fractional part; can convert to this type public static implicit operator NumberFixedPoint2(int integer) { return new NumberFixedPoint2 { number = integer }; } // this type is a […]

如何将“make”命令行参数(-D)的macros定义传递给C源代码?

我通常使用以下选项将“make command line”的macros定义传递给“makefile”:-Dname = value。 该定义可以在makefile中进行访问。 我也使用类似的编译器选项将“makefile”的macros定义传递给“源代码”:-Dname = value(在许多编译器中支持)。 这个定义可以在源代码中find。 我现在需要的是允许我的makefile的用户能够将任意macros定义从“make.exe命令行”立即传递到“源代码”,而不必在makefile中更改任何内容。 所以用户可以键入:make -f mymakefile.mk -SOMEOPTION var = 5 那么直接代码main.c就可以看到var: int main() { int i = var; }

是Int32.ToString()文化特定?

我正在运行ReSharper的testing版本,它给我警告以下代码: int id; // … DoSomethingWith(id.ToString()); 警告是在id.ToString()调用,它告诉我“明确指定string转换文化”。 我理解这个警告,并且我知道如何解决它 – 只需将代码更改为非常笨拙的id.ToString(CultureInfo.InvariantCulture) 。 但我的问题是:这是必要的吗? 我的意思是,当你使用DateTime (不同的文化有不同的date格式)和Double (不同的字符用于小数点)时,指定文化是很重要的。 但是Int32.ToString() ,至less在en-US和不变的文化中,根本不会添加任何格式。 没有逗号,没有小数点,没有美元符号,什么都没有。 那么文化会有什么不同呢? 当你调用无参数的Int32.ToString()时,是否有一些文化实际上添加了某种格式? 或者这是ReSharpertesting版中的一个错误,这个警告真的不适用于Int32 (在这种情况下,我将提交一个ReSharper错误报告)?

C#:等待所有线程完成

我正在写一个我正在编写的代码中的一个通用模式,在那里我需要等待一个组中的所有线程完成,超时。 超时应该是所有线程完成所需的时间,所以简单地为每个线程执行thread.Join(timeout)将不起作用,因为可能的超时是timeout * numThreads。 现在我做一些如下的事情: var threadFinishEvents = new List<EventWaitHandle>(); foreach (DataObject data in dataList) { // Create local variables for the thread delegate var threadFinish = new EventWaitHandle(false, EventResetMode.ManualReset); threadFinishEvents.Add(threadFinish); var localData = (DataObject) data.Clone(); var thread = new Thread( delegate() { DoThreadStuff(localData); threadFinish.Set(); } ); thread.Start(); } Mutex.WaitAll(threadFinishEvents.ToArray(), timeout); 然而,这种事情似乎应该有一个更简单的习惯用法。

如何快速删除列表中的项目

我正在寻找一种方法来快速从C# List<T>删除项目。 该文档指出, List.Remove()和List.RemoveAt()操作都是O(n) List.Remove List.RemoveAt 这严重影响了我的应用程序。 我写了几个不同的删除方法,并在一个List<String>上testing了它们全部500,000个项目。 testing用例如下所示… 概观 我写了一个方法,可以生成一个简单的包含每个数字(“1”,“2”,“3”,…)的string表示的string列表。 然后我试图remove列表remove每一个第五项。 以下是用于生成列表的方法: private List<String> GetList(int size) { List<String> myList = new List<String>(); for (int i = 0; i < size; i++) myList.Add(i.ToString()); return myList; } testing1:RemoveAt() 这是我用来testingRemoveAt()方法的testing。 private void RemoveTest1(ref List<String> list) { for (int i = 0; i < list.Count; i++) if (i […]

为什么在传递“null”常量时会得到一个exception,而在传递“null”string时则不会呢?

如果我运行这个代码: Console.WriteLine( String.Format( "{0}", null ) ); 我得到一个ArgumentNullException但如果我运行此代码: String str = null; Console.WriteLine( String.Format( "{0}", str ) ); 它运行得很好,输出是一个空string。 现在这两块看起来相当于我 – 他们都通过一个空引用到String.Format()但行为是不同的。 不同的行为如何在这里可能?

我可以通常/总是使用std :: forward而不是std :: move吗?

我一直在观看斯科特·迈耶斯(Scott Meyers) 关于 C ++和Beyond 2012会议上Universal Reference的演讲,到目前为止一切都很有意义。 然而,观众在大约50分钟的时间里问了一个问题,我也在想。 迈尔斯说,他不关心答案,因为它是非惯用的,会愚蠢的他的头脑,但我仍然感兴趣。 代码如下: // Typical function bodies with overloading: void doWork(const Widget& param) // copy { // ops and exprs using param } void doWork(Widget&& param) // move { // ops and exprs using std::move(param) } // Typical function implementations with universal reference: template <typename T> void doWork(T&& […]