相关疑难解决方法(0)

为什么C#不支持类构造函数中隐含的泛型类型?

如果编译器可以推断它,C#不要求您指定泛型类型参数,例如:

List<int> myInts = new List<int> {0,1,1,
    2,3,5,8,13,21,34,55,89,144,233,377,
    610,987,1597,2584,4181,6765};

//this statement is clunky
List<string> myStrings = myInts.
    Select<int,string>( i => i.ToString() ).
    ToList<string>();

//the type is inferred from the lambda expression
//the compiler knows that it's taking an int and 
//returning a string
List<string> myStrings = myInts.
    Select( i => i.ToString() ).
    ToList();
Run Code Online (Sandbox Code Playgroud)

这是匿名类型所必需的,你不知道类型参数是什么(在intellisense中它显示为'a),因为它是由编译器添加的.

类级别类型参数不允许您这样做:

//sample generic class
public class GenericDemo<T> 
{
    public GenericDemo ( T value ) 
    {
        GenericTypedProperty = value;
    }

    public T GenericTypedProperty {get; set;} …
Run Code Online (Sandbox Code Playgroud)

.net c# generics

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

隐藏调试器中的字段

是否可以隐藏字段和/或属性以显示在调试器监视窗口中?看,我们这里有一个有50多个私人领域的课程,其中大部分是通过公共场所公开的.这意味着我们在观察窗口列表中看到了大量数据的重复.

有没有办法控制这个?

c# debugging

34
推荐指数
2
解决办法
9123
查看次数

为什么集合初始化表达式需要实现IEnumerable?

为什么会产生编译器错误:

class X { public void Add(string str) { Console.WriteLine(str); } }

static class Program
{
    static void Main()
    {
        // error CS1922: Cannot initialize type 'X' with a collection initializer
        // because it does not implement 'System.Collections.IEnumerable'
        var x = new X { "string" };
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不是:

class X : IEnumerable
{
    public void Add(string str) { Console.WriteLine(str); }
    IEnumerator IEnumerable.GetEnumerator()
    {
        // Try to blow up horribly!
        throw new NotImplementedException();
    }
}

static class Program
{
    static …
Run Code Online (Sandbox Code Playgroud)

c# syntax language-design

32
推荐指数
1
解决办法
8520
查看次数

是什么 "??" 运营商?

我想知道代码中的??标志C#.它是为了什么?我该如何使用它?

怎么样int??它是一个可以为空的int吗?

也可以看看:

?? Null Coalescing Operator - >合并是什么意思?

c# coalesce operators null-coalescing-operator

31
推荐指数
7
解决办法
2729
查看次数

在值类型上定义的扩展方法不能用于创建委托 - 为什么不呢?

可以将扩展方法分配给与对象的用法匹配的委托,如下所示:

static class FunnyExtension {
    public static string Double(this string str) { return str + str; }
    public static int Double(this int num) { return num + num; }
}


Func<string> aaMaker = "a".Double;
Func<string, string> doubler = FunnyExtension.Double;

Console.WriteLine(aaMaker());       //Prints "aa"
Console.WriteLine(doubler("b"));    //Prints "bb"
Run Code Online (Sandbox Code Playgroud)

如果他们扩展的类型是值类型,它将不起作用:

Func<int> eightMaker = 4.Double;    //Error CS1113: Extension methods 'FunnyExtension.Double(int)' defined on value type 'int' cannot be used to create delegates
Func<int, int> intDoubler = FunnyExtension.Double;  //Works
Run Code Online (Sandbox Code Playgroud)

这给了

错误CS1113:在值类型"int"上定义的扩展方法'FunnyExtension.Double(int)'不能用于创建委托.

他们为什么不能?

.net c# extension-methods delegates value-type

31
推荐指数
1
解决办法
6617
查看次数

在.NET框架中引发事件的正确方法

目前" 避免检查空事件处理程序"是标题为C#隐藏功能的帖子的答案的顶部,它包含严重误导性信息.

虽然我理解Stack Overflow是一个"民主",并且答案因公众投票而上升到顶峰,我觉得很多投票给答案的人要么没有完全理解C#/ .NET或者没有花时间充分了解帖子中描述的做法的后果.

简而言之,该帖子主张使用以下构造来避免在调用事件时检查null.

public event EventHandler SomeEvent = delegate {};
// Later..
void DoSomething()
{
   // Invoke SomeEvent without having to check for null reference
    SomeEvent(this, EventArgs.Empty);  
}
Run Code Online (Sandbox Code Playgroud)

乍一看,这似乎是一个聪明的捷径,但它可能是大型应用程序中一些严重问题的原因,特别是如果涉及并发性.

在调用事件的委托之前,您必须检查空引用.仅仅因为您使用空委托初始化事件并不意味着您的类的用户不会在某些时候将其设置为null并破坏您的代码.

像这样的东西是典型的:

void DoSomething()
{
    if(SomeEvent != null) 
        SomeEvent(this, EventArgs.Empty);
}
Run Code Online (Sandbox Code Playgroud)

但即使在上面的例子中,也存在这样的可能性,即DoSomething()可能由一个线程运行,另一个可能会删除事件处理程序,并且可能会出现竞争条件.

假设这种情况:

      Thread A.                           Thread B.
    -------------------------------------------------------------------------
 0: if(SomeEvent != null)
 1: {                                     // remove all handlers of SomeEvent
 2:   SomeEvent(this, EventArgs.Empty);
 3: }

在引发事件的代码检查了委托以获取空引用之后,但在调用委托之前,线程B删除了SomeEvent事件的事件处理程序.当SomeEvent(this,EventArgs.Empty); 调用,SomeEvent为null并引发异常.

为了避免这种情况,提出事件的更好模式是:

void DoSomething()
{
    EventHandler handler …
Run Code Online (Sandbox Code Playgroud)

.net events delegates

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

我应该拥有哪些C#知识?

一个非常开放的问题.在过去的5个月里,我一直在使用C#进行编程,完成我成功完成的小项目.

今天我去接受C#角色的采访.第一个问题是'告诉我关于拳击'.根据我的经验,我不知道这个人是什么意思.毋庸置疑,采访并不顺利.其他问题是"为什么没有推荐使用ArrayListint","告诉我你所知道的关于线程"等

我真的不希望这种情况再发生,所以我打算花一些时间在C#上阅读(和练习).我知道最好的学习方法是通过编码,但编码不会真正帮助我回答有关'拳击'的问题.

我不是要求你回答上述技术问题.事实上,我现在知道了他们的回答,因为我在采访后直接去了谷歌,这就是我如何意识到我的C#知识有限.

我的问题是:在您看来,C#开发人员应该具备哪些知识?理想情况下,如果你能对它进行分类会更好(任何人都应该拥有的基本知识,高级知识,专家知识等).无需详细说明.对你列出的任何内容进行研究对我来说都是一个很好的练习.

c#

28
推荐指数
4
解决办法
8755
查看次数

Func <>委托有什么好处?

对不起,如果这是基本的,但我试图接受.Net 3.5.

问题:Func <>有什么好处,它有5个重载吗?从它的外观来看,我仍然可以自己创建一个类似的delgate,MyFunc <>具有5个重载甚至更多.

例如:public delegate TResult MyFunc<TResult>()和各种超载的组合......

当我试图理解Func <>委托并且遇到以下情况时,想到了这个想法:

Func<int,int> myDelegate = (y) => IsComposite(10);
Run Code Online (Sandbox Code Playgroud)

这意味着一个委托有一个int类型的参数和一个int类型的返回类型.有五种变体(如果你通过intellisense查看重载).所以我猜我们可以有一个没有返回类型的委托?

所以我有理由说Func <>不是很好,只是我们可以使用的.Net框架中的一个例子,如果需要,创建自定义"func <>"代表以满足我们自己的需求?

谢谢,

lambda delegates expression func

25
推荐指数
4
解决办法
1万
查看次数

F#隐藏的功能

这是类似C#问题的毫不掩饰的尝试.

那么你最喜欢的F#隐藏(或不是)功能是什么?

到目前为止,我使用的大部分功能并没有完全隐藏,但却非常令人耳目一新.就像C#或VB.NET相比,重载运算符是多么微不足道.

Async<T>帮助我削减了一些真正丑陋的代码.

我对这种语言还很陌生,所以了解野外使用的其他功能会很棒.

f# language-features hidden-features

23
推荐指数
9
解决办法
5572
查看次数

为事件定义空委托主体是一个好习惯吗?

可能重复:
在事件声明中添加匿名空委托是否有缺点?

为事件定义一个空委托主体是一个好习惯,这样您就不必担心引发没有事件处理程序的事件了吗?(无需检查事件是否为空).

像下面的代码:

public event EventHandler<LoadEventArgs> LoadedData = delegate { };
Run Code Online (Sandbox Code Playgroud)

c# events delegates

23
推荐指数
2
解决办法
1万
查看次数