在C#中返回字符串函数的方法

时间:2015-06-12 12:32:25

标签: c# vb.net

我是C#中的一个小程序员,但是VB.NET不得不编写很多代码。现在我怀疑代码是否运行良好。我需要你的帮助来创建一个函数,使得返回一个字符串,已经测试了下面的代码,但编译器给出了一个错误:

public class Main
{
    private System.Text.UTF8Encoding enc;
    private ICryptoTransform encryptor;
    private ICryptoTransform decryptor;

    public string utf16_encrypt(string input)
    {
        string sPlainText = input;
        string output;
        if (!string.IsNullOrEmpty(sPlainText))
        {
            MemoryStream memoryStream = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(memoryStream, this.encryptor, CryptoStreamMode.Write);
            cryptoStream.Write(enc.GetBytes(sPlainText), 0, sPlainText.Length);
            cryptoStream.FlushFinalBlock();
            output = Convert.ToBase64String(memoryStream.ToArray());
            memoryStream.Close();
            cryptoStream.Close();
            return output;
        }
    }
}

编译器给出的错误是:

http://i.imgur.com/cJeNran.png

7 个答案:

答案 0 :(得分:2)

用户,如果sPlainText为null,则您的方法不会返回任何内容。您必须牢记这一点,并确保所有执行路径都返回代码。您可以将代码更改为:

    if (!string.IsNullOrEmpty(sPlainText))
                {
                    MemoryStream memoryStream = new MemoryStream();
                    CryptoStream cryptoStream = new CryptoStream(memoryStream, this.encryptor, CryptoStreamMode.Write);
                    cryptoStream.Write(enc.GetBytes(sPlainText), 0, sPlainText.Length);
                    cryptoStream.FlushFinalBlock();
                    output = Convert.ToBase64String(memoryStream.ToArray());
                    memoryStream.Close();
                    cryptoStream.Close();
                    return output;
                }

    return "Invalid Input"; //Or whatever message you want to pass back to the user/code. 

答案 1 :(得分:1)

将此return output;放在}大括号中,如下所示:

if (!string.IsNullOrEmpty(sPlainText))
            {
                MemoryStream memoryStream = new MemoryStream();
                CryptoStream cryptoStream = new CryptoStream(memoryStream, this.encryptor, CryptoStreamMode.Write);
                cryptoStream.Write(enc.GetBytes(sPlainText), 0, sPlainText.Length);
                cryptoStream.FlushFinalBlock();
                output = Convert.ToBase64String(memoryStream.ToArray());
                memoryStream.Close();
                cryptoStream.Close();

            }
  return output;

答案 2 :(得分:1)

如果没有输入if语句,你应该考虑你的功能应该做什么。

您需要一个默认的return语句。现在,如果条件不正确,则不返回任何内容。而是写在最后的东西:

if (!string.IsNullOrEmpty(sPlainText))
            {
                ...
                return output;
            }
  return String.Empty;

答案 3 :(得分:0)

代码的真正简短版本是

    public string utf16_encrypt(string input)
    {
        string output;
        if (somecondition)
        {
           return output;
        }
    }

如果某些条件为真,编译器知道该怎么做,但如果它是假的,它就不知道了。它正在寻找像

这样的东西
    public string utf16_encrypt(string input)
    {
        string output;
        if (somecondition)
        {
           return output;
        }
        else {
           return "banana"; //when in doubt, return bananas
        }
    }

答案 4 :(得分:0)

编译器告诉您通过代码的每个逻辑路径都必须返回一个值。由于该方法声明了一个返回类型:

public string utf16_encrypt(string input)

必须返回该类型的内容(string)。所以问题就变成......

  

如果sPlainText 为空或为空,会发生什么?

如果它不为null或为空,则代码返回一些内容:

return output;

但如果它不为null或为空,则永远不会执行if块,并且没有return语句。所以你需要添加一个:

if (!string.IsNullOrEmpty(sPlainText))
{
    // your current code
}
return output;

您不必专门返回output,我只是猜到了您可能想要返回的内容。您可以返回默认值,例如:

return string.Empty;

这取决于你。关键是逻辑上该方法必须总是返回一些东西(假设它不会在异常条件下终止)。

答案 5 :(得分:0)

并非所有代码都返回值是有意义的,不是吗?

在任何情况下,您都必须确保从方法返回值。您只能从if内部返回,因此sPlainText==null不会返回任何内容。在这种情况下,您可以返回null:

public string utf16_encrypt(string input)
{
    string sPlainText = input;
    string output;
    if (!string.IsNullOrEmpty(sPlainText))
    {
        MemoryStream memoryStream = new MemoryStream();
        CryptoStream cryptoStream = new CryptoStream(memoryStream, this.encryptor, CryptoStreamMode.Write);
        cryptoStream.Write(enc.GetBytes(sPlainText), 0, sPlainText.Length);
        cryptoStream.FlushFinalBlock();
        output = Convert.ToBase64String(memoryStream.ToArray());
        memoryStream.Close();
        cryptoStream.Close();
        return output;
    }
    else
        return null;
}

顺便说一下,如果你注释掉Return Nothing

,你也会在VB.NET中得到编译器 warning
Public Function utf16_encrypt(input As String) As String
    Dim sPlainText As String = input
    Dim output As String
    If Not String.IsNullOrEmpty(sPlainText) Then
        ' ... '
        Return output
    Else
        Return Nothing
    End If
End Function

答案 6 :(得分:0)

这样做更好,看起来更简单,更容易

 public string utf16_encrypt(string input)
    {

        if (!string.IsNullOrEmpty(input)) return null;
        using (var memoryStream = new MemoryStream())
        using (var cryptoStream = new CryptoStream(memoryStream, this.encryptor, CryptoStreamMode.Write))
        {
            cryptoStream.Write(enc.GetBytes(input), 0, input.Length);
            cryptoStream.FlushFinalBlock();
            cryptoStream.FlushFinalBlock();
            return Convert.ToBase64String(memoryStream.ToArray());
        }
    }