1

要約すると、String.Concatで、文字列を結合するときに参照型のToStringオーバーロードを使用できるようにしようとしています。

編集:この概要を追加しました:以下のサンプルコードは、実際のコードを抽出したものです。そのため、コードが2行しかない場合は、リファクタリングするとすぐにわかります。ここでの(私にとっての)重要な問題は、文字列からオブジェクトに変更し、String.Concatからのコンパイルエラーがなかったことです。同様に、その動作は私が期待したものではありませんでした(bogの標準オブジェクト名ではなく、オブジェクトの文字列メソッドを使用)。「&」を使用していた場合、コンパイルエラーが発生していました。String.Concatシンタックスシュガーが、他の方法では回避されていたであろうバグにつながる可能性があるのではないかと心配しています(この場合はリファクタリング時)。String.Concatの動作を変更する方法があるかどうか、またはそれを危険と見なす必要があるかどうかを知りたいです。

状況:
大量のデータを処理するソリューションがあります。文字列を使用して各データの識別子を含めていましたが、これをクラス(FeatureIdentifier)に交換して、識別子を拡張してバッチなどを含めることができるようにしました。

コードをリファクタリングして、文字列だけでなく、このクラスを使用してください。この種のことを(正しくまたは間違って)リファクタリングするとき、私はやることリストとしてコンパイルエラーに依存する傾向があります。

今、私は独学のプログラマーであり、おそらく私のやり方に少し慣れています(私は、新しい機能を、私がすでにできることをさせてくれるのではなく、何か新しいことをさせてくれるかどうかという観点から見る傾向があります簡単にするだけです)そして私は私を悲しませている何かに出くわしました。

そのため、タイプのアンダースコアに識別子を貼り付けていました。私のコードは次のよう
Dim x as string = "MyIdentifer"
dim myOutputValue as string = String.Concat(x,"_ANCHOR.txt")
になりました。これを実行すると、myOutputValueが「MyIdentifier_ANCHOR.txt」に等しくなります。リファクタリング後、私のコードは次のよう
Dim x as new FeatureIdentifier("MyIdentifier")
dim myOutputValue as string = String.Concat(x,"_ANCHOR.txt")
になりました。これを実行すると、myOutputValueが「MyNamespace.FeatureIdentifier_ANCHOR.txt」に等しくなります。

自分自身を蹴ってクラスにToStringメソッドを実装した後、それを再度実行して、まったく同じ出力(つまり、「MyNamespace.FeatureIdentifier_ANCHOR.txt」)を取得します。すぐに:?x.ToStringを実行すると、「MyIdentifier」が表示されるので、ToStringを正しく実装したと確信しています。

だから、ここに私の問題があります。String.Concatの構文は好きですが、次のいずれかを実行しないという事実は好きではありません。

b)文字列に基づかない引数を渡すと、コンパイルエラーがスローされます。古い学校:x& "_ ANCHOR.txt"は、コンパイルエラーを表示します(リファクタリング時に検出したはずです)。

私が試したことは次のとおり
です。String.Concat関数を拡張子(次のようなもの)でシャドウイングしようとしまし
<System.Runtime.CompilerServices.Extension()> Public Function Concat(...some arguments...) As String
Return String.Concat(...some arguments...)
End Function
たが、2つの問題が発生しました:
1)引数のタイプを文字列に絞り込もうとすると、コンパイルエラーが発生します。そもそも、引数はparam配列であり、したがってオブジェクトであることに気づきました。だからそこで失敗する。
2)複数のオーバーロード((s1は文字列、s2は文字列)、(s1は文字列、s2は文字列、s3は文字列)など)を作成しようとすると、少し足りないと感じました。

それで、String.Concatを古い学校の連結と同様に動作させる方法を知っている人はいますか、それともString.Concatを避けて古い学校の連結を優先する必要がありますか?
(私はいくつかの文字列を連結しているだけであり、これが1つの場所であるとは思わないため、StringBuilderを使用するつもりはありません)。

4

2 に答える 2

1

String.Concat文字列のみを許可するようにメソッドを「修正」する方法はないと思います。共有メソッドを作成してできるだけ控えめに使用する必要がある別の理由にチョークで書きます。ただし、演​​算子のオーバーロードの奇跡により、カスタムクラスを文字列のように機能させることができます。メソッドを修正するには、演算子Concatをオーバーロードする必要があります。CType文字列連結演算子()を修正するには&、次のように、その演算子を個別にオーバーロードする必要があります。

Public Class FeatureIdentifier
    Public Sub New(id As String)
        Me.Id = id
    End Sub

    Public Property Id As String
    Public Property SomethingElse As Integer

    Public Overloads Shared Widening Operator CType(value As FeatureIdentifier) As String
        Return value.Id
    End Operator

    Public Overloads Shared Operator &(value1 As FeatureIdentifier, value2 As String) As String
        Return value1.Id & value2
    End Operator

    Public Overloads Shared Operator &(value1 As String, value2 As FeatureIdentifier) As String
        Return value1 & value2.Id
    End Operator
End Class

これで、次のように使用できます。

Dim x As New FeatureIdentifier("MyIdentifier")
Dim myOutputValue As String = String.Concat(x, "_ANCHOR.TXT")

またはこのように:

Dim x As New FeatureIdentifier("MyIdentifier")
Dim myOutputValue As String = x & "_ANCHOR.TXT"

そして、そのような状況では、それがまだストリングであるかのように機能します。万が一の場合に備えて、他の演算子の一部もオーバーロードすることをお勧めします。たとえば、+演算子は2つの文字列に適用されると連結します。ただし、演​​算子のオーバーロードは、コードに精通していない人に混乱を引き起こす可能性があることに注意する必要があります。これは、予期しない動作をするためです。したがって、実際にそうすることが理にかなっている場合にのみ使用してください。

于 2013-03-25T12:39:52.360 に答える
0

オーバーライドする必要がありますToStringか、それがこれのために呼び出されていることを確認する必要がありますか?FeatureIdentifier名前付きのプロパティ、またはそのようなものを公開する方が適切であるように思われますIdentifier。そうすれば、次のことができます。

Dim myOutputValue as string = String.Concat(x.Identifier, "_ANCHOR.txt")
于 2013-03-25T12:10:48.200 に答える