我最近在使用一个DateTime对象,并写了这样的东西:
DateTime dt = DateTime.Now;
dt.AddDays(1);
return dt; // still today's date! WTF?
Run Code Online (Sandbox Code Playgroud)
intellisense文档AddDays()说它增加了一天的日期,它没有 - 它实际上返回添加了一天的日期,所以你必须写如下:
DateTime dt = DateTime.Now;
dt = dt.AddDays(1);
return dt; // tomorrow's date
Run Code Online (Sandbox Code Playgroud)
这个曾经多次咬过我,所以我认为编制最糟糕的C#陷阱会很有用.
使用Parallel.ForEach或Task.Run()以异步方式启动一组任务有什么区别?
版本1:
List<string> strings = new List<string> { "s1", "s2", "s3" };
Parallel.ForEach(strings, s =>
{
DoSomething(s);
});
Run Code Online (Sandbox Code Playgroud)
版本2:
List<string> strings = new List<string> { "s1", "s2", "s3" };
List<Task> Tasks = new List<Task>();
foreach (var s in strings)
{
Tasks.Add(Task.Run(() => DoSomething(s)));
}
await Task.WhenAll(Tasks);
Run Code Online (Sandbox Code Playgroud) C#或.NET Framework中一些最大的设计缺陷是什么?
示例:没有非可空字符串类型,您必须在从IDataReader获取值时检查DBNull.
在以下两个片段中,第一个是安全的还是你必须做第二个?
安全我的意思是每个线程保证从创建线程的相同循环迭代中调用Foo上的方法?
或者你必须将引用复制到一个新的变量"local"到循环的每次迭代?
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Thread thread = new Thread(() => f.DoSomething());
threads.Add(thread);
thread.Start();
}
Run Code Online (Sandbox Code Playgroud)
-
var threads = new List<Thread>();
foreach (Foo f in ListOfFoo)
{
Foo f2 = f;
Thread thread = new Thread(() => f2.DoSomething());
threads.Add(thread);
thread.Start();
}
Run Code Online (Sandbox Code Playgroud)
更新:正如Jon Skeet的回答所指出的,这与线程没有任何关系.
我试图找出编译器为什么有这个功能的问题.它给了我"并非所有代码路径返回值"错误,但是我看不到控制流将传递给if( a )表达式而a不是真的情况(所以这if( a )是多余的,但编译器似乎没有认识到这一点) .
public static Boolean Foo(Boolean x)
{
Boolean a = false;
if( x )
{
a = true;
}
else
{
try
{
SomethingThatMightThrow();
Assert.IsFalse( a );
return a;
}
catch(Exception)
{
a = true;
}
}
if( a )
{
return x;
}
}
Run Code Online (Sandbox Code Playgroud)
立即解决方法是简单地立即删除if( a )guard语句return x- 但是为什么编译器会抱怨,即使它应该能够静态地证明所有可能的代码路径都会出现return声明?至关重要的是,没有循环,这通常是它无法证明的主要原因return.
我正在使用VS2015 Update 3.
我正在检查在我们的构建机器上安装.NET 4.5是否会更改VS 2010生成的输出IL映像.
因为我知道在.NET 4.5中foreach的行为已经改变以避免由于访问修改闭包引起的问题,所以我选择了一个展示该行为的简单应用程序.
class Program
{
private static void Main(string[] args)
{
var contents = new List<Func<int>>();
var s = new StringBuilder();
int[] values = new int[] { 4, 5, 6 };
foreach (int value in values)
{
contents.Add(() => value);
}
for (var k = 0; k < contents.Count; k++)
s.Append(contents[k]());
Console.WriteLine(s);
}
Run Code Online (Sandbox Code Playgroud)
VS 2010输出:666
VS 2012输出:456
我在VS 2010中创建了一个控制台应用程序,在VS 2012中创建了一个具有相同代码的控制台应用程序(都是针对.NET 4).
但是,两个控制台应用程序都基于它们构建的IDE表现出不同的行为.在构建输出中,我检查了两者都有几乎相似的构建参数.所以我想知道最终可执行文件如何表现出不同的行为?.NET 4.5是就地升级,因此两个IDE的编译器必须相同.
注意:我确实看过一个相关的问题:VS 2010和VS 2012中的不同LINQ答案,但它没有回答我关于可执行行为不同的问题.
编辑1: 正如mletterle所提到的,我确实尝试在VS 2010命令提示符中使用VS …
假设我的对象处于完美的工作状态(即TDD让我觉得它们有效).
我有一个我这样创建的列表(正确缩进除外):
var result = from v in vendors
from p in v.Products
orderby p.Name
select p;
Run Code Online (Sandbox Code Playgroud)
这有效 - 我从所有供应商处获得所有产品.
现在我有一个条件列表,由用户在运行时构建.让我们应用它们:
foreach (Attribute a in requiredAttributes)
{
result = result.Where(p => p.Attributes.Contains(a));
}
Run Code Online (Sandbox Code Playgroud)
这可能是原始的,但我认为它有用.但是,在完成此foreach循环之后,当您枚举"result"时,它将包含其Attributes属性(也是集合)中具有requiredAttributes集合的LAST属性的所有产品.
对我来说,这种气味就像"a"被覆盖在某个地方,每次旅行通过循环,只有最后一个适用.
如果没有以某种方式将扩展方法写入IEnumerable,称为ContainsAll(IEnumerable)或其他类似的东西,我怎么能实现我想要的,这基本上是一个逻辑AND,只给我那些具有所有必需属性的产品?
可能重复:
foreach循环如何在C#中工作?
我一直在网上搜索,我很难找到任何关于foreachC#循环幕后真实情况的答案.
我知道这个问题并不真正与实际编码有关,但它困扰着我.我对OO编程很熟悉,特别是接口.我知道他们是合同,我知道如何IEnumerable和IEnumerator工作-我还是这么认为.
我一直在MSDN上阅读这篇文章: IEnumerable Interface
我理解一切都是如何建立的.我有点不清楚,虽然在Main循环中如何foreach知道通过所有的值来迭代_people.怎么知道这个?它如何Current通过调用来跟踪return new PeopleEnum(_people);?
编辑:我不知道这是一个完全重复.是的,它的类似理由和同样的问题被问到,但我们正在寻找不同的答案或我想要的答案在前一个问题中没有讨论过.
像foreach(在obj中的int i){...}等等的foreach循环等同于
......"有点"不是我正在寻找的答案.
ReSharper 6.0为我提供dr了第一个代码片段中标识符的"访问修改后的闭包"警告.
private IEnumerable<string> GetTheDataTableStrings(DataTable dt) {
foreach (DataRow dr in dt.Rows) {
yield return GetStringFuncOutput(() => dr.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
我想我已经基本了解了这个警告试图保护我的内容:dr在询问GetTheDataTableStrings的输出之前多次更改,因此调用者可能无法获得我期望的输出/行为.
但是R#没有给我第二个代码片段的任何警告.
private IEnumerable<string> GetTheDataTableStrings(DataTable dt) {
return from DataRow dr in dt.Rows select GetStringFuncOutput(dr.ToString);
}
Run Code Online (Sandbox Code Playgroud)
使用理解语法时,放弃此警告/关注是否安全?
其他代码:
string GetStringFuncOutput(Func<string> stringFunc) {
return stringFunc();
}
Run Code Online (Sandbox Code Playgroud)