关于c#:这个关键字和双问号(??)让我感到困惑


The this keyword and double question mark (??) confuse me

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What do two question marks together mean in C#?

这是添加到c 3.x的新功能吗?

例如

1
2
3
4
5
6
7
8
public class HttpRequests
{
    public string GetHtmlContent(this HttpRequest myRequest)
    {            
       //do something
       return retStr ?? (retStr=new GetHtmlStr(urlStr));
    }
}

这个和??对我来说很奇怪,因为我已经好几年没有更新我对C的了解了。我知道C 2。

对于条件if和返回值,即

return a == 0 ? a:b;

是的,我能理解这是什么。有人能解释一下吗?


??—与.NET 2.0一起引入的空合并运算符

方法->中的this指定现有类型的扩展方法,用c_3.0引入


这是指扩展方法

关于扩展方法,您可以在此链接中找到一个全面的详细信息

The ?? operator is called the null-coalescing operator and is used to
define a default value for a nullable value types as well as reference
types. It returns the left-hand operand if it is not null; otherwise
it returns the right operand.


是的,这是新功能。

这在第一个方法参数之前意味着该方法是一个扩展方法。我很确定该函数必须是静态的才能有效。

所以要使用这个方法,你可以写

1
2
3
HttpRequest request;
// assign request
request.GetHtmlContent();

并以请求为参数调用gethtmlcontent。

这个??是空合并运算符,用于简化对空的检查。

而不是

1
2
3
string s;
// ... s something something
// return s == null ? s ="default" : s;

这意味着,如果字符串s为空,则返回该值,但如果它不为空,则返回s的值,您只需编写:

返回S?"默认";

如果不为空则返回s,如果为空则默认返回s。


这个限定词

在静态类内的静态方法的第一个参数之前使用this限定符时,该方法称为"扩展方法"。基本上你是在对编译器说:"嘿,我想把这个方法添加到一个现有的类中而不修改它。"

Linq集中使用它们(有关详细信息,请参见Enumerable类)。

??或空合并运算符

??或空合并运算符是用于以下内容的语法糖:

1
var2 = var1 == null ? something : var1;

实际上,您可以用一行简单的代码替换上面的操作:

1
var2 = var1 ?? something;


1
GetHtmlContent(this HttpRequest myRequest)

好吧,这推断它是一个Extension method,但是您的代码编译吗,因为您的类不是静态的

When the first parameter of a method includes the this modifier, that
method is said to be an extension method. Extension methods can only
be declared in non-generic, non-nested static classes. The first
parameter of an extension method can have no modifiers other than
this, and the parameter type cannot be a pointer type.

另外,??是一个空合并运算符

1
string something = maybenull ??"I cannot be null";

因此,当maybenull对象为空时,您将得到分配给您的字符串的另一个字符串。


这是一个空的装煤操作员,请参阅msdn解释。