注意:当C#尚未支持可选参数时(即在C#4之前),就会询问此问题.
我们正在构建一个通过C#类以编程方式生成的Web API.该类有方法GetFooBar(int a, int b),API有一个GetFooBar接受查询参数的方法&a=foo &b=bar.
这些类需要支持可选参数,C#语言不支持这些参数.什么是最好的方法?
我注意到,如果在接口上将参数指定为可选参数,则使用C#4中的可选参数,您不必在任何实现类上使该参数可选:
public interface MyInterface
{
void TestMethod(bool flag = false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
Run Code Online (Sandbox Code Playgroud)
因此:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么可选参数设计为这样工作?
一方面,我认为覆盖接口上指定的任何默认值的能力是有用的,但老实说,我不确定您是否应该能够在接口上指定默认值,因为这应该是一个实现决策.
另一方面,这种断开意味着您不能总是交替使用具体类和接口.当然,如果在实现上指定了默认值,那么这不是问题,但是如果你将具体类作为接口公开(使用一些IOC框架来注入具体的类),那么真的没有具有默认值的点,因为调用者无论如何都必须始终提供它.
"关键字参数"与常规参数有何不同?不能传递所有参数name=value而不是使用位置语法?
python arguments keyword optional-parameters named-parameters
我正在调试一些JavaScript,并不能解释这||是做什么的?
function (title, msg) {
var title = title || 'Error';
var msg = msg || 'Error on Request';
}
Run Code Online (Sandbox Code Playgroud)
有人可以给我一个提示,为什么这个人正在使用var title = title || 'ERROR'?我有时也会在没有var声明的情况下看到它.
C#4.0是否允许可选out或ref参数?
我正在创建一个存储过程来搜索表.我有许多不同的搜索字段,所有这些字段都是可选的.有没有办法创建一个存储过程来处理这个?假设我有一个包含四个字段的表:ID,FirstName,LastName和Title.我可以这样做:
CREATE PROCEDURE spDoSearch
@FirstName varchar(25) = null,
@LastName varchar(25) = null,
@Title varchar(25) = null
AS
BEGIN
SELECT ID, FirstName, LastName, Title
FROM tblUsers
WHERE
FirstName = ISNULL(@FirstName, FirstName) AND
LastName = ISNULL(@LastName, LastName) AND
Title = ISNULL(@Title, Title)
END
Run Code Online (Sandbox Code Playgroud)
这种作品.但是它会忽略FirstName,LastName或Title为NULL的记录.如果未在搜索参数中指定Title,我想包含Title为NULL的记录 - 对于FirstName和LastName是相同的.我知道我可以用动态SQL做到这一点,但我想避免这种情况.
我发现C#中的命名参数功能在某些情况下非常有用.
calculateBMI(70, height: 175);
Run Code Online (Sandbox Code Playgroud)
如果我想在javascript中使用该怎么办?
我不想要的是 -
myFunction({ param1: 70, param2: 175 });
function myFunction(params){
// Check if params is an object
// Check if the parameters I need are non-null
// Blah blah
}
Run Code Online (Sandbox Code Playgroud)
我已经使用过这种方法.还有另外一种方法吗?
我可以使用任何库来做这件事.(或者有人可以指出我已经做过的那个)
我想说:
public void Problem(Guid optional = Guid.Empty)
{
}
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨Guid.Empty不是编译时常量.
由于我不想更改API,我无法使用:
Nullable<Guid>
Run Code Online (Sandbox Code Playgroud) 1.
int Add (int a, int b = 3);
int Add (int a, int b)
{
}
Run Code Online (Sandbox Code Playgroud)
2.
int Add (int a, int b);
int Add (int a, int b = 3)
{
}
Run Code Online (Sandbox Code Playgroud)
两者都有效; 这是标准的方式,为什么?
c# ×3
c#-4.0 ×3
javascript ×2
.net ×1
arguments ×1
c++ ×1
function ×1
interface ×1
java ×1
keyword ×1
or-operator ×1
parameters ×1
python ×1
syntax ×1
t-sql ×1