相关疑难解决方法(0)

C#或.NET中最糟糕的问题是什么?

我最近在使用一个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#陷阱会很有用.

.net c#

377
推荐指数
45
解决办法
4万
查看次数

Parallel.ForEach vs Task.Run和Task.WhenAll

使用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# async-await parallel.foreach

144
推荐指数
2
解决办法
7万
查看次数

85
推荐指数
2
解决办法
9万
查看次数

C#(.NET)设计缺陷

C#或.NET Framework中一些最大的设计缺陷是什么?

示例:没有非可空字符串类型,您必须在从IDataReader获取值时检查DBNull.

.net c#

85
推荐指数
21
解决办法
1万
查看次数

foreach标识符和闭包

在以下两个片段中,第一个是安全的还是你必须做第二个?

安全我的意思是每个线程保证从创建线程的相同循环迭代中调用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的回答所指出的,这与线程没有任何关系.

c# closures enumeration

78
推荐指数
3
解决办法
1万
查看次数

为什么编译器会抱怨"当所有代码路径都没有返回值"时,我可以清楚地看到它们的作用?

我试图找出编译器为什么有这个功能的问题.它给了我"并非所有代码路径返回值"错误,但是我看不到控制流将传递给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.

c# static-analysis compiler-errors

28
推荐指数
3
解决办法
2766
查看次数

为什么在VS 2010和VS 2012中构建的应用程序的行为存在差异?

我正在检查在我们的构建机器上安装.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 …

.net visual-studio-2010 visual-studio-2012

19
推荐指数
2
解决办法
2355
查看次数

以编程方式构建LINQ查询而没有局部变量欺骗我

假设我的对象处于完美的工作状态(即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,只给我那些具有所有必需属性的产品?

c# linq

12
推荐指数
3
解决办法
5250
查看次数

"foreach"循环背后发生了什么?

可能重复:
foreach循环如何在C#中工作?

我一直在网上搜索,我很难找到任何关于foreachC#循环幕后真实情况的答案.

我知道这个问题并不真正与实际编码有关,但它困扰着我.我对OO编程很熟悉,特别是接口.我知道他们是合同,我知道如何IEnumerableIEnumerator工作-我还是这么认为.

我一直在MSDN上阅读这篇文章: IEnumerable Interface

我理解一切都是如何建立的.我有点不清楚,虽然在Main循环中如何foreach知道通过所有的值来迭代_people.怎么知道这个?它如何Current通过调用来跟踪return new PeopleEnum(_people);

编辑:我不知道这是一个完全重复.是的,它的类似理由和同样的问题被问到,但我们正在寻找不同的答案我想要的答案在前一个问题中没有讨论过.

像foreach(在obj中的int i){...}等等的foreach循环等同于

......"有点"不是我正在寻找的答案.

c# clr foreach

11
推荐指数
1
解决办法
1429
查看次数

是否通过理解语法解决了"访问修改后的闭包"的问题?

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)

c# warnings list-comprehension resharper-6.0

10
推荐指数
2
解决办法
1666
查看次数