是否可以在C#中使用变量作为默认参数?

时间:2015-11-12 04:49:13

标签: c# optional-parameters

我正在使用"BrowserSession"并添加了2个变量来跟踪用户名和密码,以登录网站。

A: 2
B: 2
C: 2
D: 0
F: 1

**
**
**

*

我还添加了这个设置_username和_password变量的函数

    private string _username;
    private string _password;

    public StoredAccountInfo RefreshAccountData(string username = _username, string password = _password)
    {
        if ((string.IsNullOrEmpty(username)) || (string.IsNullOrEmpty(password))
        {
            //throw Exception("Password Or Username Not Set");
        }
        BrowserLogin(username, password);//In case user is not logged in
        StoredAccountInfo retdata = new StoredAccountInfo();
        //populate retdata
        return retdata;

然而

    public void BrowserLogin(string username, string password)
    {
        if (Cookies == null)
        {
            //Do Site Login Here If not Logged In
            Get(constants.BaseUrl);
            FormElements["UserName"] = username;
            FormElements["PassWord"] = password;
            Post(constants.loginUrl);
            _username = username;
            _password = password;
        }
    }

给我语法错误 “public StoredAccountInfo RefreshAccountData(string username = _username, string password = _password)

任何人都知道变通方法或解决方案?我不想传递用户名和密码每次调用RefreshAccountData方法时,如果在第一次浏览器登录之前调用它,我希望能够从中设置用户名和密码变量。

我可能只是完全错过了一个非常简单的方法来做到这一点。但我似乎无法想到任何事情。

3 个答案:

答案 0 :(得分:3)

如果传递null,则可以默认为null并使用这些变量:

public StoredAccountInfo RefreshAccountData(string username = null, string password = null)
{
    username = username ?? _username;
    password = password ?? _password;
    if ((string.IsNullOrEmpty(username)) || 
        (string.IsNullOrEmpty(password))
    {
        //throw Exception("Password Or Username Not Set");
    }

或者您可以提供第二种方法,它不会接受这些参数并将变量传递给您的main方法,这可以让您在调用者实际尝试传递碰巧为null的用户名或密码时捕获抛出错误。

public StoredAccountInfo RefreshAccountData()
{
    RefreshAccountData(_username, _password);
}

答案 1 :(得分:1)

您不能将变量用作可选参数。您必须声明方法的重载。好难过! :(

public StoredAccountInfo RefreshAccountData() {
    return RefreshAccountData (_username, _password);
}

不幸的是,无法使用可选参数。

让我解释一下为什么你不能。可选参数值将放入已编译的代码中。因此,如果您更改变量的值,编译的代码将不会更改,对吧?长话短说,编译后的代码无法检测到变量值的变化。

答案 2 :(得分:1)

重载方法:

public void BrowserLogin(string username, string password)
{
...
}

public void BrowserLogin(string username)
{
  BrowserLogin(username, _password);
}

public void BrowserLogin()
{
  BrowserLogin(_username, _password);
}

参数对象:

public class LoginParams 
{
  public string UserName { get; set; }
  public string Password { get; set; }
}

public void BrowserLogin(LoginParams aParams)
{
  if (aParams.UserName == null)
    <use this._username>
  if (aParams.Password == null)
    <use this._password>
...
}

BrowserLogin(new LoginParams());
BrowserLogin(new LoginParams() { UserName = username });
BrowserLogin(new LoginParams() { UserName = username, Password = password });