我是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;
}
}
}
编译器给出的错误是:
答案 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
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());
}
}