小编Cui*_*崔鹏飞的帖子

为什么Enumerable.All为空序列返回true?

var strs = new Collection<string>();
bool b = strs.All(str => str == "ABC");
Run Code Online (Sandbox Code Playgroud)

代码创建一个空的字符串集合,然后尝试确定集合中的所有元素是否为"ABC".如果你运行它,b将是真的.

但是该集合甚至没有任何元素,更不用说任何等于"ABC"的元素了.

这是一个错误,还是有合理的解释?

.net c# linq enumerable

100
推荐指数
4
解决办法
3万
查看次数

在C#中,为什么我不能在foreach循环中修改值类型实例的成员?

我知道值类型应该是不可变的,但这只是一个建议,而不是一个规则,对吧?那么为什么我不能做这样的事情:

struct MyStruct
{
    public string Name { get; set; }
}

 public class Program
{
    static void Main(string[] args)
    {
        MyStruct[] array = new MyStruct[] { new MyStruct { Name = "1" }, new MyStruct { Name = "2" } };
        foreach (var item in array)
        {
            item.Name = "3";
        }
        //for (int i = 0; i < array.Length; i++)
        //{
        //    array[i].Name = "3";
        //}

        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

代码中的foreach循环不会编译,而注释for循环工作正常.错误消息:

无法修改'item'的成员,因为它是'foreach迭代变量'

这是为什么?

c# foreach immutability value-type

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

C#4.0的新功能 - "可选参数"是否符合CLS?

这个新功能非常方便.

最近我阅读了"Microsoft All-In-One Code Framework"的文档,并提到"Optional Parameters"不符合CLS.

所以我在公共API中使用"Optional Parameters"测试它,然后打开FxCop,然后我编译了,FxCop没有抱怨任何事情.平均而言,当我添加一个具有uint作为返回类型的API时,FxCop确实报告了一个警告.

所以现在我很困惑,"可选参数"是否符合CLS标准?

什么是找出新语言功能是否符合CLS标准的最佳方法?

.net c# optional-parameters cls-compliant c#-4.0

30
推荐指数
2
解决办法
1686
查看次数

如何知道哪些其他项目引用Visual Studio中的某个项目?

在Visual Studio中,对于类,字段,方法,我可以右键单击并查找"查找所有引用"以查看谁在调用我的代码.

但是项目没有类似的东西.

最简单的方法是什么?我是否必须检查每个项目?

编辑: 在此输入图像描述

A指的是B,但是使用正则表达式找不到B.

projects-and-solutions visual-studio-2010 visual-studio-project find-all-references visual-studio

22
推荐指数
3
解决办法
5761
查看次数

在.NET中,使用"foreach"迭代IEnumerable <ValueType>的实例会创建一个副本吗?那么我是否应该使用"for"而不是"foreach"?

在.NET中,使用"foreach"迭代IEnumerable的实例会创建一个副本吗?那么我是否应该使用"for"而不是"foreach"?

我写了一些代码来证明这一点:

struct ValueTypeWithOneField
{
    private Int64 field1;
}

struct ValueTypeWithFiveField
{
    private Int64 field1;
    private Int64 field2;
    private Int64 field3;
    private Int64 field4;
    private Int64 field5;
}

public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("one field");
        Test<ValueTypeWithOneField>();

        Console.WriteLine("-----------");

        Console.WriteLine("Five field");
        Test<ValueTypeWithFiveField>();

        Console.ReadLine();
    }

    static void Test<T>()
    {
        var test = new List<T>();
        for (int i = 0; i < 5000000; i++)
        {
            test.Add(default(T));
        }

        Stopwatch sw = new Stopwatch();

        for (int i = 0; i < 5; …
Run Code Online (Sandbox Code Playgroud)

.net c# performance foreach value-type

21
推荐指数
2
解决办法
4073
查看次数

关于C#中的lock语句的困惑

这来自MSDN:lock关键字确保一个线程不进入代码的关键部分,而另一个线程处于临界区.

难道一个关键部分必须是相同的关键部分

或者它的意思是:lock关键字确保一个线程不会进入代码对象保护的任何关键部分,而另一个线程处于由同一对象保护的任何关键部分.?

    class Program
{
    static void Main(string[] args)
    {
        TestDifferentCriticalSections();

        Console.ReadLine();
    }

    private static void TestDifferentCriticalSections()
    {
        Test lo = new Test();

        Thread t1 = new Thread(() =>
        {
            lo.MethodA();
        });
        t1.Start();

        Thread t2 = new Thread(() =>
        {
            lo.MethodB();
        });
        t2.Start();
    }
}

public class Test
{
    private object obj = new object();

    public Test()
    { }

    public void MethodA()
    {
        lock (obj) …
Run Code Online (Sandbox Code Playgroud)

c# multithreading locking block critical-section

20
推荐指数
2
解决办法
9119
查看次数

.Net中的字典是否可能在并行读取和写入时导致死锁?

我正在玩TPL,并试图通过并行读取和写入同一个词典来找出我可以做多么大的混乱.

所以我有这个代码:

    private static void HowCouldARegularDicionaryDeadLock()
    {
        for (var i = 0; i < 20000; i++)
        {
            TryToReproduceProblem();
        }
    }

    private static void TryToReproduceProblem()
    {
        try
        {
            var dictionary = new Dictionary<int, int>();
            Enumerable.Range(0, 1000000)
                .ToList()
                .AsParallel()
                .ForAll(n =>
                {
                    if (!dictionary.ContainsKey(n))
                    {
                        dictionary[n] = n; //write
                    }
                    var readValue = dictionary[n]; //read
                });
        }
        catch (AggregateException e)
        {
            e.Flatten()
                .InnerExceptions.ToList()
                .ForEach(i => Console.WriteLine(i.Message));
        }
    }
Run Code Online (Sandbox Code Playgroud)

它确实很乱,有很多异常抛出,大多数关于密钥不存在,一些关于索引超出数组的范围.

但运行应用程序一段时间后,它挂起,并且CPU百分比保持在25%,机器有8个核心.所以我假设2个线程满负荷运行.

在此输入图像描述

然后我在上面运行了dottrace,得到了这个:

在此输入图像描述

它符合我的猜测,两个线程以100%运行.

两者都运行Dictionary的FindEntry方法.

然后我用dottrace再次运行应用程序,这次结果略有不同:

在此输入图像描述

这一次,一个线程正在运行FindEntry,另一个正在运行.

我的第一个直觉是它被锁定了,但后来我认为它不可能,只有一个共享资源,而且它没有被锁定.

那怎么解释呢?

ps:我不打算解决问题,可以通过使用ConcurrentDictionary或通过并行聚合来解决.我只是在寻找一个合理的解释.

.net c# parallel-processing multithreading task-parallel-library

19
推荐指数
3
解决办法
2392
查看次数

一个奇怪的Visual Studio 2010调试器案例(它无法达到一个断点)

一个奇怪的Visual Studio 2010调试器案例(它无法达到一个断点)

这是重现问题的代码:

class Program {
  static void Main(string[] args) {
    bool b = false;

    if (b) {
        List<string> list = new List<string>();
        foreach (var item in list) {

        }
    } else {
        Console.WriteLine("1");
    }
    Console.WriteLine("2");//add a break point here in VS2010
  }
  //1. configuration: release
  //2. platform target: x64 or Any Cpu
  //3. debug info: pdb only or full
  //4. OS: Win7 x64
  //5. optimize code: enabled
}
Run Code Online (Sandbox Code Playgroud)

在代码的最后一个语句中添加一个断点,然后在vs2010中调试它,你会看到无法命中断点.

要重现这个奇怪的情况,您需要满足以下条件:

  1. 操作系统:windows 7 x64;
  2. VS build配置:发布;
  3. VS构建平台目标:x64或Any Cpu;
  4. VS构建调试信息:pdb …

.net c# debugging breakpoints visual-studio

16
推荐指数
2
解决办法
7019
查看次数

foreach纯粹是"语法糖"吗?

当与数组一起使用时,编译器将foreach循环编译成类似for循环的循环foreach.并且当与or一起使用时,编译器将foreach循环编译成类似while循环的循环.那么这是否是纯粹?或者有什么复杂的东西吗?foreachIEnumerableIEnumerable<T>foreachsyntactic sugar

CLR知道foreach吗?foreach在MSIL代码中是否有专门设计的内容?

.net c# syntax foreach syntactic-sugar

14
推荐指数
2
解决办法
2459
查看次数

在metro风格的app中使用传统组件

我知道我们可以在用c#编写的metro风格应用程序中访问部分.net apis和所有winrt apis.但是,针对.net 2.0或3.5等的其他第三方组件,我们能够将它们作为地铁样式应用项目中的参考添加吗?

.net c# microsoft-metro windows-8

14
推荐指数
1
解决办法
2099
查看次数