C# 有没有更简单的方法从静态函数返回字段?
我经常想把一个字符串解析成不同的位,并以可读的方式返回它们 我喜欢这种方法,但它需要创建一个特定的类C# 有没有更简单的方法从静态函数返回字段?,c#,C#,我经常想把一个字符串解析成不同的位,并以可读的方式返回它们 我喜欢这种方法,但它需要创建一个特定的类 long orderID = Utils.UnTradeIdent(tradeIdent).OrderID; 在Utils.cs中: public class TradeIdentData { public string AccountIdent; public long OrderID; public string SubID;
long orderID = Utils.UnTradeIdent(tradeIdent).OrderID;
在Utils.cs中:
public class TradeIdentData
{
public string AccountIdent;
public long OrderID;
public string SubID;
}
public static TradeIdentData UnTradeIdent(string tradeIdent)
{
TradeIdentData tradeIdentData = new TradeIdentData();
var parts = tradeIdent.Split('!');
tradeIdentData.AccountIdent = parts[0];
if (parts[1].Contains("."))
{
var bits = parts[1].Split('.');
tradeIdentData.OrderID = long.Parse(bits[1]);
tradeIdentData.SubID = bits[1];
}
else
{
tradeIdentData.OrderID = long.Parse(parts[1]);
tradeIdentData.SubID = "";
}
return tradeIdentData;
}
只需将返回类型更改为dynamic并使用匿名类,操作起来就非常简单
public static dynamic UnTradeIdent(string tradeIdent)
{
var value1 = //parselogic
var value2 = //parselogic
return new { Identity = value1, Item2 = value2};
}
只需将返回类型更改为dynamic并使用匿名类,操作起来就非常简单
public static dynamic UnTradeIdent(string tradeIdent)
{
var value1 = //parselogic
var value2 = //parselogic
return new { Identity = value1, Item2 = value2};
}
一个具有良好命名属性的单独类(您已经在使用)是目前最可读的方法 在C#7中,可以使用元组作为返回值,如下所示:
public static (string AccountIdent, string OrderID, string SubID) UnTradeIdent(string tradeIdent)
{
string accountIdent, orderID, subID ;
... Code to initialise accountIdent, orderID and subID appropriately ...
// Now return the data as a tuple:
return (accountIdent, orderID, subID);
}
您可以按如下方式使用此功能:
long orderID = Utils.UnTradeIdent(tradeIdent).OrderID;
或者,如果需要所有值:
var result = Utils.UnTradeIdent(tradeIdent);
// Use result.OrderId, result.SubID or result.AccountIdent
不过,这要到明年某个时候才能提供
此外,尽管这种新的元组支持使编写代码更加方便,但它也不允许您使用XML注释来记录代码。花时间编写一个简单且文档完整的类通常比使用新的C#7元组支持要好
.一个具有良好命名属性的单独类(您已经在使用)是目前最可读的方法 在C#7中,可以使用元组作为返回值,如下所示:
public static (string AccountIdent, string OrderID, string SubID) UnTradeIdent(string tradeIdent)
{
string accountIdent, orderID, subID ;
... Code to initialise accountIdent, orderID and subID appropriately ...
// Now return the data as a tuple:
return (accountIdent, orderID, subID);
}
您可以按如下方式使用此功能:
long orderID = Utils.UnTradeIdent(tradeIdent).OrderID;
或者,如果需要所有值:
var result = Utils.UnTradeIdent(tradeIdent);
// Use result.OrderId, result.SubID or result.AccountIdent
不过,这要到明年某个时候才能提供
此外,尽管这种新的元组支持使编写代码更加方便,但它也不允许您使用XML注释来记录代码。花时间编写一个简单且文档完整的类通常比使用新的C#7元组支持要好
< /P> < P>我会考虑做另外的静态方法。当您需要所有返回的属性时,您当前的实现会更干净,但是当您只需要其中一个属性时,下面类似的内容可能会更合适
public static string TradeIdentToAccountIdent(string tradeIdent)
{
var parts = tradeIdent.Split('!');
return parts[0];
}
public static long TradeIdentToOrderID(string tradeIdent)
{
var parts = tradeIdent.Split('!');
if (parts[1].Contains("."))
{
var bits = parts[1].Split('.');
return long.Parse(bits[1]); // Taken from your example, should probably be bits[0]?
}
else
return long.Parse(parts[1]);
}
// My own take on it this time, you could obviously use your logic as well.
public static string TradeIdentToSubID(string tradeIdent)
{
var order = tradeIdent.Split('!')[1];
if (order.Contains("."))
return order.Split('.')[1];
else
return String.Empty;
}
我会考虑做一些静态的方法。当您需要所有返回的属性时,您当前的实现会更干净,但是当您只需要其中一个属性时,下面类似的内容可能会更合适
public static string TradeIdentToAccountIdent(string tradeIdent)
{
var parts = tradeIdent.Split('!');
return parts[0];
}
public static long TradeIdentToOrderID(string tradeIdent)
{
var parts = tradeIdent.Split('!');
if (parts[1].Contains("."))
{
var bits = parts[1].Split('.');
return long.Parse(bits[1]); // Taken from your example, should probably be bits[0]?
}
else
return long.Parse(parts[1]);
}
// My own take on it this time, you could obviously use your logic as well.
public static string TradeIdentToSubID(string tradeIdent)
{
var order = tradeIdent.Split('!')[1];
if (order.Contains("."))
return order.Split('.')[1];
else
return String.Empty;
}
您还可以使用
out
关键字通过引用传递参数,请参阅MSDN文章:
根据评论意见更新了:
public static bool UnTradeIdent(string tradeIdent, out string AccountIdent, out long OrderID, out string SubID)
{
bool result = false;
AccountIdent = "";
OrderID = 0;
SubID = "";
try
{
var parts = tradeIdent.Split('!');
AccountIdent = parts[0];
if (parts[1].Contains("."))
{
var bits = parts[1].Split('.');
OrderID = long.Parse(bits[1]);
SubID = bits[1];
}
else
{
OrderID = long.Parse(parts[1]);
SubID = "";
}
}
catch(ArgumentNullException ane)
{
// Handle parsing exception
}
catch (FormatException fe)
{
// Handle parsing exception
}
catch (OverflowException oe)
{
// Handle parsing exception
}
return result;
}
您还可以使用
out
关键字通过引用传递参数,请参阅MSDN文章:
根据评论意见更新了:
public static bool UnTradeIdent(string tradeIdent, out string AccountIdent, out long OrderID, out string SubID)
{
bool result = false;
AccountIdent = "";
OrderID = 0;
SubID = "";
try
{
var parts = tradeIdent.Split('!');
AccountIdent = parts[0];
if (parts[1].Contains("."))
{
var bits = parts[1].Split('.');
OrderID = long.Parse(bits[1]);
SubID = bits[1];
}
else
{
OrderID = long.Parse(parts[1]);
SubID = "";
}
}
catch(ArgumentNullException ane)
{
// Handle parsing exception
}
catch (FormatException fe)
{
// Handle parsing exception
}
catch (OverflowException oe)
{
// Handle parsing exception
}
return result;
}
在即将到来的C#7中,你可以使用内置元组功能:描述你返回的内容,这不是一个坏主意。在即将到来的C#7中,你可以使用内置元组功能:描述你返回的内容,这不是一个坏主意。哇,太棒了!如果不涉及脚本语言,我将避免使用
dynamic
。这通常意味着一个糟糕的设计。没有对它们进行编译时检查,这可能会导致运行时错误。@manimoon这并不奇妙,事实并非如此。不要用那个。编译器将允许您对返回值的属性使用任何旧名称,如果错误,它将在编译时给您一个错误。它将在运行时使用编译器生成动态
“它通常意味着一个糟糕的设计”的代码,这有点笼统。这样做很方便,而且并不总是意味着设计不好。哇,太棒了!如果不涉及脚本语言,我将避免使用dynamic
。这通常意味着一个糟糕的设计。没有对它们进行编译时检查,这可能会导致运行时错误。@manimoon这并不奇妙,事实并非如此。不要用那个。编译器将允许您对返回值的属性使用任何旧名称,如果错误,它将在编译时给您一个错误。它将在运行时使用编译器生成动态
“它通常意味着一个糟糕的设计”的代码,这有点笼统。这样做非常方便,而且并不总是意味着设计不好。回答不错,但我会扩展此方法,在可以解析/指示out
值有效时返回bool。像int.TryParse()
etc@JeroenvanLangen非常好的建议,我已经更新了answerNice答案,但我会扩展此方法,在可以解析/指示out
值有效时返回bool。像int.TryParse()
etc@JeroenvanLangen很好的建议,我已经更新了答案