Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有更简单的方法从静态函数返回字段?_C# - Fatal编程技术网

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很好的建议,我已经更新了答案