2017-10-05 5 views
-2

私はSystem.Stringを拡張しようとしていて、1つのスペースString.Spaceをもう1つ追加します。" " の名前空間にUsing System;を実装したのとまったく同じです。この拡張機能を実装することができません。String.Emptyと同様のString.SpaceをC#で拡張する方法は?

私はフィールド拡張の種類を実装したかった

...

enter image description here

enter image description here

+2

これまでに何を試しましたか? 「実装できない」とはどういう意味ですか?詳しくは – logix

+2

を教えてください。私も*なぜ*あなたはこれをしたいのですか? – DiskJunky

+1

ここで回答を確認してください:https://stackoverflow.com/questions/249222/can-i-add-extension-methods-to-an-existing-static-class –

答えて

4

で不幸な枠組み(V4.7のような結果を望んでいましたこの執筆の時点)は現在、拡張プロパティ/フィールドをサポートしていません。ここでこれを書いてください。"Why No Extension Properties?"

これは、拡張メソッドの使用に限定されていることを意味します。 その一例:

namespace System.String 
{ 
    public static class Extensions 
    { 
     public static string Space(this string s) 
     { 
      return " "; 
     } 
    } 
} 

拡張メソッドは、オブジェクトのインスタンスを必要とします。だから、そのように使用することができます。

// Returns " " 
var space = "".Space(); 

それとも

// Returns " " 
var space = String.Empty.Space(); 

これは、それらの「それはきれいではありませんが、それが動作する」のいずれかのカテゴリに分類されます。

+3

単純な 'var space = '''はどうですか?または別の単純な 'var space = MyConstants.Space;'(SpaceはMyConstantsクラスのpublic readonlyプロパティとして)?拡張メソッドは、より美しいコードを書くための文法的な砂糖です。それらを使って "not pretty"コードを書いても意味がありません。 –

+0

@GianPaolo私は完全に同意します。この点について私は個人的には内線番号を使用しません。OPはプロパティの拡張を望んでいましたが、私はまだ拡張構文に合った代替案を提供しました。 DiskJunkyは、代替の非拡張候補を提供することで正しいです。 –

12

static classのようにすることができます。

public static class Strings 
{ 
    public const string Space = " "; 
} 

などのコードで使用します。

FullName = FirstName + Strings.Space + MiddleName + Strings.Space + LastName; 

しかし、究極の目的は、コードを保守し、合理的に効率的にし、エラーの可能性を減らすことです。これを念頭において、連結の数を減らし、必要な値だけを供給することが最善です。その目的のために、単純な書式文字列はよりクリーンなアプローチになります。 (プレC#6)。

FullName = string.Format("{0} {1} {2}", FirstName, MiddleName, LastName); 

C#6 +

FullName = $"{FirstName} {MiddleName} {LastName}"; 

なぜこれら最後の2つのアプローチを使用しますか?さて、それは懸念の分離に帰着します。文字列書式をstring.Format()のままにして、必要な値を入力するだけです。ミックスに含まれるコンポーネントの数を減らし、メンテナンスのオーバーヘッドを削減し、連結を実行するために必要な文字列の数を減らすことで、エラーの可能性を減らします。

EDIT「なぜはないC#のサポート拡張プロパティについては

?」、私はC#言語の開発チームからLindos Pechoslinkからの引用を抽出したい。

拡張メソッドへの自然なコンパニオンが拡張プロパティであることはもちろん、すぐに明らかだったそれは、何らかの理由で、あまり目立たないのです。拡張イベント、拡張演算子、拡張コンストラクタ(「ファクトリパターン」とも呼ばれます)なども自然な仲間ですが、C#3の拡張プロパティの設計も考慮されていませんでした。魅力的な利益のために既に危険なスケジュールにリスクを加えるだろう。

基本的には、 string.Spaceのようなものを作成できるようにする拡張プロパティのための魅力的な必要性。多分将来のバージョンで。

+0

はい私は同意しますが、MicrosoftはStringを使用しています。 @logixが投稿したかったので、私は単純な例を提供しました。 –

+0

@RahulUttarkar彼らはそうしましたが、スペースは '' ''より稀です。そして、@ LindosPechosが言ったように、あなたがOPでやっているのは拡張プロパティがない理由があります。 – DiskJunky

+1

@RahulUttarkarその過去の遺物。 [This](https://stackoverflow.com/questions/151472/what-is-the-difference-between-string-empty-and-empty-string)はあなたのためにinteresstingかもしれません。 –

0

私は以下を行うことができました。警告が出ますが、コンパイルされます。代わりに

string sp = String.Space; 
+2

あなたは 'const'または少なくとも' readonly'にする必要があります – DiskJunky

1
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace StringFunctions.Extensions 
{ 
    public static class StringExtensions 
    { 
     public static readonly string Space = " "; 

     public static string Spacemethod(this string name) 
     { 
      return string.Concat(name," "); 
     } 
    } 
} 

をStringクラスのエイリアス名を使用します。呼び出すに

namespace System 
{ 
    public static partial class String 
    { 
     public static string Space = " "; 
    } 
} 

。 Like

using String = StringFunctions.Extensions.StringExtensions;

string.Emptyあなたの機能がString.Space

using String = StringFunctions.Extensions.StringExtensions; 
namespace StringFunctions 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var t = String.Space; 

     } 

    } 
} 

次のように呼び出すように、それはクラス、他の文字列関数呼び出しの全体の場所を作品の= WそれはあなたがString.Spaceを取得Error.ifを投げるだ、予約語、それでは小さな文字列
+0

メソッドを拡張するだけですクラスのプロパティやフィールドではありません。エイリアス名の拡張フィールドをこのタイプのように設定する唯一の方法です。一部の予約語は小文字の開始文字列のように機能しません。これは既にSystem.Stringのエイリアス名です – umasankar

関連する問題