後方互換性が必要ないと仮定して、C#または.Netの機能を停止しますか?[閉まっている]


18

製品またはフレームワークは進化します。主に、ユーザーのニーズをキャッチし、新しいコンピューティングパワーを活用し、単純に改善するために行われます。製品によって主要な設計目標も変わる場合があります。C#または.netフレームワークも例外ではありません。ご覧のとおり、現在の第4バージョンは、第1バージョンとは大きく異なります。しかし、物事はこの進化の後方互換性に対する障壁となっています。

ほとんどのフレームワーク/製品では、下位互換性をサポートする必要がなければ機能が中断されます。あなたによると、C#/。netのこれらの機能は何ですか?

回答ごとに1つの機能をお知らせください。



4
質問は明らかにガイドラインに従って建設的ではなく、素晴らしい答えに基づいて明らかに建設的です。再開の投票。
psr

1
残念ですが、ここで答える代わりにエリックがブログを書くかもしれませんか?
jk。

回答:


35

匿名メソッド。C#2.0に選択された匿名メソッドの構文は、C#3.0に追加されたラムダ構文と比較して、チャンキーで不格好であることに誰もが同意すると思います。同じことを行うために、ほぼ同一の2つの構文があるのは非常に残念です。


1
合意された、匿名メソッドは、ラムダを持っていなかったときは素晴らしかった...今ではそれらは単に冗長です。
マイケルブラウン

9
ラムダ式よりもはるかに優れた匿名メソッドの特別な機能が1つあります。完全な名前です。
探検家

1
この時点で、C#の匿名メソッドの構文さえ覚えていません。何らかの奇妙な理由でラムダの代わりにラムダを使用する必要がある場合は、検索する必要があります。
キラレッサ

33

非ジェネリックコレクションは削除します。それらは憎むべきものです...そして私がlinqを使用していて、

var customObjects = container.CustomObjects.Cast<CustomObject>();

それをしなければならないたびに、私の魂の小さな部分が死にます。


これはすごすぎる。

1
.NETのすべてのポートがジェネリックをサポートするわけではありません。.NET Microはその一例です。CustomObjectsがこのプラットフォームに移動しない場合は適用されません。
-goodguys_activate

2
それは魂を持っていないことの利点です。
-CaffGeek

29

タイプとしては無効。一体なぜ「ボイド」タイプなのでしょうか?インスタンスも値もありません。ジェネリック型の引数、仮パラメータ型、ローカル型、フィールド型、またはプロパティ型として使用することはできません。型としての意味はありません。むしろ、メソッド呼び出しが仮想マシンのスタックに与える影響についての事実です。しかし、仮想マシンはまさにそれです。仮想マシンです。実際のマシンは返された値をレジスタ(通常はx86のEAX)に格納し、スタックにはまったく影響を与えません!型としてのVoidは、あらゆる点で悪い考えです。

さらに悪いことに、ポインタ型で使用する場合は、まったく異なるvoid*ものを意味します戻り値の型として使用した場合、それが何を意味するのかよりを。現在では、「不明な型の格納場所へのポインタ」を意味し、「値を返さないメソッド」としての意味とは何の関係もありません。

void*ポインタ型としてに置き換えることができますIntPtr。(そして、void**IntPtr*のように。)私たちは、「ユニット」、単一の値、すなわち、ヌルを持っているタイプの戻り値の型として無効置き換えることができます。CLRの実装は、ユニット型関数呼び出しがレジスタまたはスタックの使用を適切に最適化できると判断し、「返される」nullを安全に無視できることを知っています。

そのような世界では、あなたは、もはや分離必要はないFunc<A, R>Action<T>のデリゲート。Action<T>ただFunc<T, Unit>です。


4
...そしてTaskただTask<Unit>です。CTPは、私は本当にこのために望む作られた非同期のライブラリビット...再実装
ジョンスキート

24

空のステートメント;。エラーが発生しやすく、ほとんどの場合はタイプミスであり、でまだ表現されていない追加の意味はありません{}


7
64ビットJITの下でのパフォーマンスの大幅な低下は言うまでもありません</ snark>。
ジェシーC.スライサー

7
空のステートメントにはパフォーマンスのペナルティがありますか?何故ですか?
クエンティン・スターリン

22

参照型の配列の安全でない共分散。タイプセーフ共分散がオンのIEnumerable<T>場合、少なくとも配列共分散の必要性の一部はなくなりました。(共変な読み取り専用リストインターフェイスがあれば、まったく必要ありません。)


質問のタイトルを見たとき、私は絶対にこれを書き留めるつもりでした-あなたはそれに打ち負かされました:(
クリススミス

1
共変配列参照を受け取り、そこから読み取られた配列参照に安全に書き込む機能は便利です。以下のような場合IList<T>から継承IReadableList<out T>し、非ジェネリックIPemutable、それは並べ替えのようなものをサポートすることができますが、配列は、より簡単に、それをサポートしています。
supercat

14

単項プラス演算子。すべての時間の最も有用な演算子。下位互換性のために保持する必要がない場合は、ハートビートで削除します。誰がこれを使用しますか?

(明確化:単項プラス演算子+xは、プリ++xインクリメント演算子ではなく、ポストインクリメント演算子x++でもバイナリ加算演算子でもありませんx+y。)


1
for(int i = 0; i <ceiling; i ++)
マイケルブラウン

13
彼は、プリインクリメント演算子とポストインクリメント演算子について話しているのではなく、単項プラス、つまり数字のマイナス記号の反対について話している+1 == 1。これは何もしない操作に近いものです。
ジェシーC.スライサー

8
機械可読な出力への影響だけでなく、人間のコードの見た目を改善することができますif(a == +1 || a == -1){...}
トーマスブラット

5
@ShuggyCoUK:特に奇妙なのは、オーバーロードが可能なことです。それはたくさん起こるからです。JavaScriptをどのように書いているか、そしてだと思うなら、JSでC#のようにユーザー定義の単項プラス演算子セマンティクスを作成できるようにしたいと思います。
エリックリッパー

2
@Eric私はそれがオーバーロード可能であることを知りませんでした。うわー、あなたはそれでいくつかの厄介な難読化を行うことができます:)
ShuggyCoUk

12

デフォルトの数値リテラル double

とにかくほとんどのビジネスアプリにとってdecimalは、より適切です...または多分それは単にデフォルトのアイデアを削除し、開発者に実際に選択させることをお勧めします。

(あまりにも、いくつかの他のもののために適切であろう「デフォルトを削除」。例えば、私はクラスがデフォルトで密封されるべきであることを皆を説得しようとしてあきらめましたが、私はそれは、彼らがすべきことを人々を説得する方が簡単だ疑いがあるということだと思うについて新しいクラスを封印する必要があるかどうかを明示します。)


私はおそらく、正確にdouble / floatとして表現できない値を意味するリテラルを識別することに傾いていました
...-ShuggyCoUk

Javaを使用する場合は、Joshua Blochの神聖なテキストを参照してください。「継承のための設計または文書」またはmartinfowler.com/bliki/DesignedInheritance.html IIRC kotlinはデフォルトでクラスをシールするため、業界はこの点でより良い方向。
エラザールレイボヴィッチ

クラスを封印する必要があるのはなぜですか?
ジェームズ

@ジェームズ:ジョシュが与えるまさにその理由から。賢明で一貫した方法で継承を可能にするクラスの設計には時間がかかります。継承がどのように使用されるかを知らずにそうすることはさらに悪いことです。
ジョンスキート

1
@Pacerier:たとえば、不変性について考えてください。サブクラスは可変性を導入する可能性があるため、非密閉クラスは不変であると主張することはできません。
ジョンスキート14


6

さまざまなタイマークラスには大きな違いがあることを知っています。とにかく、そのうちの1つまたは2つを取り除くことはできませんか?


4

メソッドとの種類ArrayList<T>、それは例えば、LINQので時代遅れになりました:

  • Array.TrueForAll に置き換えることができます Enumerable.All
  • Array.FindAll に置き換えることができます Enumerable.Where
  • List<T>.ConvertAll に置き換えることができます Enumerable.Select
  • Predicate<T> に置き換えることができます Func<T, bool>
  • Converter<T,R> に置き換えることができます Func<T, R>
  • IComparer<T> 本当に代理人である必要があります Func<T, T, int>

3
Predicate<T>関数がどのように使用されるかについての意図をキャプチャし、タイピングのほんの少しを節約するので、私は好きです。
ゼビ

2

非ジェネリックデリゲート 非ジェネリックコレクションと同様に、FuncおよびActionシリーズがあるため、非ジェネリックデリゲートは役に立たなくなりました。そして、3つのパラメーターでバリアントをカットオフします。3つ以上のパラメーターがある場合は、構造を作成し、それを単一のパラメーターとして使用します。イベント処理のために特定のデリゲートを宣言することは、あまり乾燥していません。


3
ActionまたはFuncでref intを取るメソッドへのデリゲートをどのように定義しますか?Funcでコンビネーターをどのように定義しますか?つまり、「デリゲートDD(D d);」と言う方法はありません。Funcで。
エリックリッパー

2
うーん...私は訂正します。だからこそ、私はあなたの有能な手で使用するツールを作成する仕事を辞めます;)
マイケルブラウン

@EricLippert:CLRマジックを通じて「すべての」アリティのデリゲートと値/参照パラメーターの組み合わせを含む特別なデリゲートクラスを見たい[マジッククラスで適切にフォーマットされた名前を持つデリゲートを検索するとタイプ]、および適切な署名のすべてのデリゲートがそれを継承します。特定のデリゲートが必要なコードには正確な型が必要ですが、特定の署名が必要なコードにはマジックネームを使用できます。
supercat


-2

Winforms
2つのデスクトッププラットフォーム間を移動する必要がないのは良いことです。WPFは状況の変化に対応しているため、プラットフォームレベルで完全な冗長性を確保するのが面倒です。


リサイズはるかに安定し、より速く、およびWPF未満バギー...らしい
Pacerier

小さなデスクトップアプリをハックする必要がある場合、WPFは大げさすぎます。
キラレッサ

その間、WPFはWinRTを支持してかなり時代遅れになったようです。しかし、私にとっては、Winformsはビジネス開発においてWPFよりも生きているようです。参照してくださいstackoverflow.com/questions/913417/...
ドク・ブラウン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.