Tag: C#的

“未定义的行为”是否真的允许任何事情发生?

编辑:这个问题不是作为一个论坛来讨论未定义行为的(德)优点,但是这就是它的成果。 无论如何, 这个关于一个没有未定义行为的假想C编译器的线程可能会让那些认为这是一个重要主题的人感兴趣。 当然,“未定义的行为”这个典型的伪造的例子是“鼻恶魔” – 无论C和C ++标准允许如何,这在物理上是不可能的。 由于C和C ++社区倾向于强调未定义行为的不可预测性,以及在遇到未定义的行为时允许编译器使程序执行字面上的任何事情的想法,所以我认为标准没有任何限制在行为上,还有未定义的行为。 但是C ++标准中的相关引用似乎是 : [C++14: defns.undefined]: [..]允许的未定义的行为范围从忽略完全不可预测的结果的情况,到在翻译或程序执行过程中以文件化的方式表现环境特征(无论是否发行诊断消息),终止翻译或执行(发布诊断消息)。 [..] 这实际上指定了一小组可能的选项: 忽略情况 – 是的,标准继续说这将会有“不可预知的结果”,但这不像编译器插入代码(我认为这是鼻病毒的先决条件)。 以一种有记录的方式表现环境特征 – 这实际上听起来相当温和。 (我当然没有听说过鼻病毒的案件记录。) 终止翻译或执行 – 与诊断,不下。 那么所有的UB都会表现得如此完美。 我认为在大多数情况下,编译器会选择忽略未定义的行为; 例如,在读取未初始化的内存时,可能会插入任何代码以确保一致的行为,这是一种反优化。 我认为陌生人的不确定行为(比如“ 时间旅行 ”)属于第二类,但是这要求将这种行为记录下来并且“环境特征”(所以我猜鼻子恶魔只是由地狱电脑?)。 我误解了这个定义吗? 这些意图仅仅是作为什么可能构成未定义行为的例子 ,而不是一个全面的选择清单? “任何事情都可能发生”这个说法只是意味着忽视这种情况的意想不到的副作用? 编辑:澄清的两个小点: 我原以为这个问题很清楚,我觉得对大多数人来说是这样,但我仍然会把它解释清楚:我知道“鼻子恶魔”是口齿不清的。 请不要写(其他)答案解释UB允许特定于平台的编译器优化,除非您还解释如何允许实现定义的行为不允许的优化。

Winforms双缓冲

我把这个添加到我的表单的构造函数代码中: this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); 但是,当它加载控件时,它仍然显示丑陋的文物,只要它们改变(表单及其组件更改(需要更新))。 我需要做什么不同?

CA2202,如何解决这种情况

任何人都可以告诉我如何从下面的代码中删除所有的CA2202警告? public static byte[] Encrypt(string data, byte[] key, byte[] iv) { using(MemoryStream memoryStream = new MemoryStream()) { using (DESCryptoServiceProvider cryptograph = new DESCryptoServiceProvider()) { using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptograph.CreateEncryptor(key, iv), CryptoStreamMode.Write)) { using(StreamWriter streamWriter = new StreamWriter(cryptoStream)) { streamWriter.Write(data); } } } return memoryStream.ToArray(); } } 警告7 CA2202:Microsoft.Usage:Object'cryptoStream'可以在方法CryptoServices.Encrypt(string,byte [],byte [])'中多次使用。 为了避免产生System.ObjectDisposedException,你不应该在一个对象上多次调用Dispose:Lines:34 警告8 CA2202:Microsoft.Usage:Object'memoryStream'可以在方法CryptoServices.Encrypt(string,byte […]

对无符号和有符号整数进行比较操作

看到这个代码片段 int main() { unsigned int a = 1000; int b = -1; if (a>b) printf("A is BIG! %d\n", ab); else printf("a is SMALL! %d\n", ab); return 0; } 这给出了输出:a是SMALL:1001 我不明白这里发生了什么事情。 >运营商如何在这里工作? 为什么“a”小于“b”? 如果它确实更小,为什么我得到一个正数(1001)的差异?

字符串输出:格式或concat在C#?

假设您要输出或连接字符串。 您更喜欢以下哪种款式? var p = new { FirstName = "Bill", LastName = "Gates" }; Console.WriteLine("{0} {1}", p.FirstName, p.LastName); Console.WriteLine(p.FirstName + " " + p.LastName); 你宁愿使用格式还是只是简单地串接字符串? 什么是你最喜欢的? 这其中的一个伤害你的眼睛? 你有任何理性的论点来使用一个而不是另一个? 我会去第二个

数组的排列

例如,我有这个数组: int a[] = new int[]{3,4,6,2,1}; 我需要列出所有的排列,如果这样的话, {3,2,1,4,6} ,其他的不能相同。 我知道,如果数组的长度是n,那么就有n! 可能的组合。 这个算法怎么写? 更新:谢谢,但我需要一个伪代码算法,如: for(int i=0;i<a.length;i++){ // code here } 只是算法。 是的,API函数很好,但是对我来说并没有太大的帮助。

为什么当模板参数被用作另一个模板的模板参数时,不能推导出模板参数?

这个代码有什么错? #include <map> template<typename T> struct TMap { typedef std::map<T, T> Type; }; template<typename T> T test(typename TMap <T>::Type &tmap_) { return 0.0; } int _tmain(int argc, _TCHAR* argv[]) { TMap<double>::Type tmap; tmap[1.1] = 5.2; double d = test(tmap); //Error: could not deduce template argument for T return 0; }

为什么要使用strncpy而不是strcpy?

编辑:我已经添加了该示例的源代码。 我遇到这个例子 : char source[MAX] = "123456789"; char source1[MAX] = "123456789"; char destination[MAX] = "abcdefg"; char destination1[MAX] = "abcdefg"; char *return_string; int index = 5; /* This is how strcpy works */ printf("destination is originally = '%s'\n", destination); return_string = strcpy(destination, source); printf("after strcpy, dest becomes '%s'\n\n", destination); /* This is how strncpy works */ […]

为什么Cdecl调用在“标准”P / Invoke惯例中常常不匹配?

我正在研究一个相当大的代码库,其中C ++功能是从C#调用的。 我们的代码库中有很多调用,例如… C ++: extern "C" int __stdcall InvokedFunction(int); 与相应的C#: [DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Cdecl)] private static extern int InvokedFunction(IntPtr intArg); 我已经搜寻了网络(就我的能力而言),为什么存在这种明显的不匹配。 例如,为什么C#中有一个Cdecl,C ++中有__stdcall? 显然,这会导致堆栈被清除两次,但是,在这两种情况下,变量都以相同的相反顺序被压入堆栈,这样我就不会看到任何错误,尽管返回信息在在调试过程中尝试跟踪? 从MSDN: http : //msdn.microsoft.com/en-us/library/2x8kf7zx%28v=vs.100%29.aspx // explicit DLLImport needed here to use P/Invoke marshalling [DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl, CharSet = CharSet::Ansi)] // […]

使用C#,如何找出哪个进程锁定了一个文件?

在Windows中,我如何确定(使用C#)哪个进程锁定了一个文件? 第三方工具是有帮助的,但不是我要找的。