C#参数未返回新值

时间:2015-07-16 19:45:36

标签: c# switch-statement parameter-passing return-value

我有一个方法,它接受两个字符串参数,并允许在必要时更改第二个参数。利用switch case,我想更改传递给新值的变量之一的值(“INVALID.FORMAT@EMAIL.COM”)。

                    string email ="jibberishtext";
                    string url = ...


                    validateData("email", email);
                    if (!email.Contains("INVALID"))
                        sendData(objAcctQryOut, "NET"); 

...

    private static string validateData(string mode, string field)
        {    ...
            ElectronicAddressAddUpdateResponse eR = myClient.ElectronicAddressAddUpdate(upd, true, appId, pass);

switch (mode)
            {
                case "email":

                    if (eR.Result.Equals("SUCCESS"))
                        return field;
                    else
                        field = "INVALID.FORMAT@EMAIL.COM";

                    return field;

                case "url":
                 ...
                case "phone":
                 ...

                case "fax":
                 ...

            }
            return field;
        }

我的问题是 - 在validateData方法中,第二个电子邮件变量返回到使用电子邮件“jibberishtext”中包含的字符串填充,而不是在变量字段中反映新返回的字符串。有人可以解释为什么会这样吗?谢谢。

2 个答案:

答案 0 :(得分:2)

只需更改一行:

validateData("email", email);

为:

email = validateData("email", email);

您正在返回email字符串的修改版本,因此需要重新分配给email

如果你想对此进行改进,那么我实际上会将值分配给一个新变量,以记录它现在已经过验证的事实:

var validatedEmail = validateData("email", email);

最后,您的validateData方法不是很好。它采用模式参数,并且根据该参数的值,它执行一系列很大程度上不相关的函数。经验法则:一种方法应该只做一件事。如果参数上有ifswitch,请将您的方法拆分为处理每种情况的单个方法。

答案 1 :(得分:1)

您可以string validEmail = validateData("email", email);返回修改后的电子邮件不会更改原始电子邮件。

正在传递和复制值(按值传递)。通过引用(使用ref关键字)传递基元(如字符串)通常不是一个很好的做法,除非它们是对象 - 这样做默认情况下。

如果您想要更像OOP的样式,请尝试避免使用静态方法和开关,并尽可能考虑对象。