1

我有一个带有这个签名的函数:

public void DoSomething(String name);

该字符串name在我的应用程序中很特殊。它可以是任意字符串,也可以是特殊的已知值。因为任何非空字符串值都是有效输入,这意味着我需要对空字符串使用对象引用相等,如下所示:

public class Foo {

    public const String SpecialValue1 = "";
    public const String SpecialValue2 = "";

    public void DoSomething(String name) {

        if( Object.ReferenceEquals( name, SpecialValue1 ) ) {



        } else if( Object.ReferenceEquals( name, SpecialValue2 ) {


        } else {

        }
    }

    public void UsageExample() {

        DoSomething( SpecialValue1 );
        DoSomething( "some arbitrary value" );
    }
}

我想知道这种使用空字符串和对象引用相等的技术是否总是安全的,尤其是在字符串实习方面。

4

2 回答 2

3

锑对这行不通的原因是正确的

我建议您为参数定义一个类型。让我们称之为ExampleArgument

public class ExampleArgument
{
    private readonly int _knownValue;
    private readonly string _arbitraryValue;

    public ExampleArgument(string arbitraryValue)
    {
        _arbitraryValue = arbitraryValue;
        _knownValue = 0;
    }

    private ExampleArgument(int knownValue)
    {
        _knownValue = knownValue;
        _arbitraryValue = null;
    }

    public static readonly ExampleArgument FirstKnownValue = new ExampleArgument(1);
    public static readonly ExampleArgument SecondKnownValue = new ExampleArgument(2);

    // obvious Equals and GetHashCode overloads

    // possibly other useful methods that depend on the application
}

哦,如果您真的想要示例中的调用语法,您可以添加:

    public static implicit operator ExampleArgument(string arbitraryValue)
    {
        return new ExampleArgument(arbitraryValue);
    }

这是从 string 到 的隐式转换运算符ExampleArgument

DoSomething(ExampleArgument.FirstKnownValue);
DoSomething(new ExampleArgument("hello"));
DoSomething("hello"); // equivalent to previous line, uses implicit conversion operator
于 2013-05-19T06:05:24.150 回答
1

不,这不安全。事实上,这永远不会奏效。字符串字面量会被保留,因此两个特殊值将具有相同的引用。大多数编译器也会对时间常数字符串进行实习,您始终可以手动实习字符串。

不幸的是,如果你想接受任何有效的字符串,你需要一些其他的方式来传递额外的信息。即使这样的 hack 有效,这也是一个坏主意,因为它违反了正常的字符串相等语义。

以下是我能想到的可能性

  • 如果只有一个特殊值,可以使用 null
  • 以更广泛的类型(例如 Object)作为输入
  • 取两个参数
  • 做一个单独的函数
于 2013-05-19T05:49:39.797 回答