タグ付けされた質問 「c#」

C#は、Microsoftが.NETプラットフォームと並行して作成した、マルチパラダイムで管理されたガベージコレクションのオブジェクト指向プログラミング言語です。

4
整数識別子を列挙型にマッピングすることの欠点は何ですか?
私はこのような識別子のカスタム型を作成することを考えています: public enum CustomerId : int { /* intentionally empty */ } public enum OrderId : int { } public enum ProductId : int { } これの主な動機は、orderItemIdを予期していた関数に誤ってorderItemIdを渡すようなバグを防ぐことです。 列挙型は、典型的な.NET Webアプリケーションで使用するすべてのものとシームレスに動作するようです。 MVCルーティングは正常に動作します JSONシリアル化は正常に動作します 私がうまくいくと思うすべてのORM だから今、私は「なぜ私はこれをするべきではないのだろうか?これらは私が考えることができる唯一の欠点です。 他の開発者を混乱させる可能性があります 非整数の識別子がある場合、システムに不整合が生じます。 のように、追加のキャストが必要になる場合があり(CustomerId)42ます。しかし、ORMおよびMVCルーティングは通常、enum型の値を直接渡すので、これが問題になるとは思いません。 だから私の質問は、何が欠けているのですか?これはおそらく悪い考えですが、なぜですか?
16 c# 

2
シリアル化と逆シリアル化は、シリアル化されるクラスの責任ですか?
現在、C#.NETアプリケーションのいくつかのモデルクラスの(再)設計段階にいます。(MVCのMのようなモデル)。モデルクラスには、適切に設計されたデータ、動作、および相互関係が十分にあります。モデルをPythonからC#に書き換えています。 古いPythonモデルでは、いぼが見えると思います。各モデルはそれ自体をシリアル化する方法を知っており、シリアル化ロジックはクラスの残りの動作とは関係ありません。たとえば、想像してみてください: Image.toJPG(String filePath) .fromJPG(String filePath)メソッドを持つクラス ImageMetaData.toString()and .fromString(String serialized)メソッドを持つクラス。 これらのシリアル化メソッドがクラスの他の部分と密接に結びついていないことを想像できますが、クラスだけがそれ自体をシリアル化するのに十分なデータを知っていることが保証されます。 クラスが自分自身をシリアル化および逆シリアル化する方法を知ることは一般的な習慣ですか?または、一般的なパターンが欠落していますか?

7
C#、Javaなどの数学指向コードの読みやすさを改善するにはどうすればよいですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 CプログラマとC#プログラマの両方として、私がC#で気に入らないことの1つは、数学関数の冗長性です。たとえば、サイン関数、コサイン関数、またはべき関数を使用する必要があるたびに、Math静的クラスを追加する必要があります。方程式自体が非常に単純な場合、これは非常に長いコードにつながります。データ型を型キャストする必要がある場合、問題はさらに悪化します。その結果、私の意見では、読みやすさが低下します。例えば: double x = -Math.Cos(X) * Math.Sin(Z) + Math.Sin(X) * Math.Sin(Y) * Math.Cos(Z); 単純に反対 double x = -cos(X) * sin(Z) + sin(X) * sin(Y) * cos(Z); これは、Javaのような他の言語にも当てはまります。 この質問に実際に解決策があるかどうかはわかりませんが、C#またはJavaプログラマーがMathコードの可読性を向上させるために使用するトリックがあるかどうかを知りたいと思います。ただし、C#/ Java / etc。MATLABなどの数学指向の言語ではないため、理にかなっています。ただし、場合によっては数学コードを記述する必要があり、読みやすくすることができれば素晴らしいことです。
16 java  c#  math  readability 

1
マジックメソッドがC#で実装されたのはなぜですか?
C#では、インターフェイスによってバックアップされることなく、これらすべての魔法のメソッドがポップアップ表示されるようになりました。なぜこれが選ばれたのですか? 説明させてください。 以前のC#では、オブジェクトがIEnumerableインターフェイスを実装すると、foreachループによって自動的に反復可能になりました。インターフェースによってバックアップされているため、それは理にかなっています。Iterator繰り返し処理されるクラス内に独自の関数がある場合、魔法のように何かを意味することを心配せずにそれを行うことができます。 今、どうやら(いつかはわからないが)、これらのインターフェースはもはや必要ではない。正しい命名変換が必要なだけです。 別の例は、いくつかの特定のプロパティを持つ正確 な名前のメソッドを持つことにより、オブジェクトを待機可能にすることGetAwaiterです。 この「マジック」を静的にバックアップしIEnumerableたりINotifyPropertyChanged、静的にバックアップしたりするようなインターフェースを作成してみませんか? ここでの意味の詳細: http://blog.nem.ec/2014/01/01/magic-methods-c-sharp/ 魔法の手法の長所と短所は何ですか?また、これらの決定が行われた理由について何かを見つけることができるオンラインの場所はどこにありますか?
16 c# 

4
単純なプロパティでAggressiveInliningを使用することには欠点がありますか?
C#/ JITがどのように動作するかを分析するためのツールについてもっと知っていれば、私は自分自身に答えることができるに違いないが、そうではないので、私に尋ねてください。 私はこのような簡単なコードを持っています: private SqlMetaData[] meta; [MethodImpl(MethodImplOptions.AggressiveInlining)] private SqlMetaData[] Meta { get { return this.meta; } } ご覧のとおり、AggressiveInliningをインライン化する必要があると感じたため、AggressiveInliningを配置しました。 おもう。それ以外の場合、JITがインライン化する保証はありません。私が間違っている? この種のことを行うと、パフォーマンス/安定性/何かが損なわれる可能性がありますか?

1
訪問者パターンを理解する
GUIコントロールを表すクラスの階層があります。このようなもの: Control->ContainerControl->Form さまざまなことを行うオブジェクトで動作する一連のアルゴリズムを実装する必要があり、Visitorパターンが最もクリーンなソリューションになると考えています。たとえば、オブジェクトの階層のXML表現を作成するアルゴリズムを考えてみましょう。「クラシック」アプローチを使用して、私はこれを行います: public abstract class Control { public virtual XmlElement ToXML(XmlDocument document) { XmlElement xml = document.CreateElement(this.GetType().Name); // Create element, fill it with attributes declared with control return xml; } } public abstract class ContainerControl : Control { public override XmlElement ToXML(XmlDocument document) { XmlElement xml = base.ToXML(document); // …

3
ジェネリックはどのように実装されますか?
これは、コンパイラ内部の観点からの質問です。 テンプレート(C ++)ではなくジェネリックに興味があるため、質問にC#を付けました。なぜなら、両言語のジェネリックは実装が異なるためです。 ジェネリックなしの言語を見ると、非常に簡単です。クラス定義を検証し、階層に追加するだけです。 しかし、ジェネリッククラスをどうするか、さらに重要なことには、それへの参照をどのように処理するのでしょうか?インスタンス化ごとに静的フィールドが特異であることを確認する方法(つまり、ジェネリックパラメーターが解決されるたびに)。 私は電話を見たとしましょう: var x = new Foo<Bar>(); Foo_Bar階層に新しいクラスを追加しますか? 更新:これまでのところ、関連する投稿は2つしか見つかりませんでしたが、「自分でどうやってやるのか」という意味ではあまり詳しくありません。 http://www.jprl.com/Blog/archive/development/2007/Aug-31.html http://www.artima.com/intv/generics2.html
16 c#  generics 

3
BackgroundWorkerとAsync / Await
私はC#開発の初心者であり、より応答性の高いUIを作成したいと考えています。私の予備調査では、これを達成するための2つの方法を見てきました。 BackgroundWorkerクラスと組み合わせたマルチスレッド。 新しいAsync / Await修飾子。 新しい方が良いという意味ですか?2つの方法の違いは何ですか?新しいプロジェクトを作成したい場合、どの方法を選択するのですか? 編集:たぶん指定する必要があります。Windows Formsアプリケーションを作成しています。ここでは、必要なすべてのデータがローカルディスクに保存/ロードされます。また、いくつかのUSBデバイスと通信します。

3
専用スレッドロックオブジェクトの命名規則[非公開]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 比較的マイナーな質問ですが、公式のドキュメントやブログに関する意見/議論すら見つけることができませんでした。 簡単に言えば、私が唯一の目的をprivateに提供することを目的とするprivateオブジェクトがある場合、そのオブジェクトlockに何と名前を付けますか? class MyClass { private object LockingObject = new object(); void DoSomething() { lock(LockingObject) { //do something } } } LockingObjectここで何と名付けるべきですか?また、変数の名前だけでなく、ロック時にコード内でどのように見えるかを考慮してください。 さまざまな例を見てきましたが、しっかりしたアドバイスはないようです。 の多数の使用法SyncRoot(およびなどのバリエーション_syncRoot)。 コードサンプル: lock(SyncRoot)、lock(_syncRoot) これは、VBの同等のSyncLockステートメント、SyncRootICollectionクラスのいくつかに存在するプロパティ、およびある種のSyncRootデザインパターンの一部に影響を受けているようです(おそらく悪い考えです) C#コンテキストにいるので、VBishの名前を付けたいかどうかはわかりません。さらに悪いことに、VBでは、変数にキーワードと同じ名前を付けます。これが混乱の原因になるかどうかはわかりません。 thisLockおよびlockThisMSDNの記事から:C#lockステートメント、VB SyncLockステートメント コードサンプル: lock(thisLock)、lock(lockThis) これらが例のために最低限純粋に命名されたかどうかはわかりません staticクラス/メソッド内でこれを使用している場合、ちょっと変です。 編集:ロックに関するウィキペディアの記事も、この命名を例に使用しています PadLock(さまざまなケーシングの)のいくつかの使用法 コードサンプル: lock(PadLock)、lock(padlock) 悪くないが、私の唯一の牛肉は、それは当然の画像呼び出した物理私は関連付けるていない傾向があり、「南京錠」抽象スレッドのコンセプトを。 ロックするものに基づいてロックに名前を付ける コードサンプル: lock(messagesLock)、lock(DictionaryLock)、lock(commandQueueLock) VB SyncRoot MSDNページの例にはsimpleMessageList、プライベートmessagesLockオブジェクトの例があります 実装の詳細は変更される可能性があるため、ロックしている型(「DictionaryLock」)に対してロックに名前を付けることは良い考えではないと思います。ロックしているコンセプト/オブジェクト( "messagesLock"または …

5
C#インターフェースでのキーワード「使用」の使用
C#を使用してコードを記述し、Visual Studio 2010を使用してインターフェイスを定義すると、常に(使用例に示すように)多数の "using"ステートメントが含まれます。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestEngine.TestNameSpace { interface ITest1 { bool testMethod(int xyz); } } これらが何のためにあり、本当に必要なのだろうか。これらは省略できますか?インターフェイスの説明でこれらの部分を使用している場合にのみ必要ですか?

4
プライベートフィールドの有無にかかわらずプロパティを優先する必要がありますか?
現在作業しているコードベースには、プライベートフィールドとパブリックプロパティを使用する規則があります。たとえば、ほとんどのクラスのメンバーは次のように定義されています。 // Fields private double _foo; private double _bar; private double _baz; // Properties public double Foo { get{ return _foo; } set{ _foo = value; } } public double Bar { get{ return _bar; } set{ _bar = value; } } public double Baz { get{ return _baz; } …
16 c#  coding-style 

4
C#メソッドでの戻り変数の宣言と直接値を返す
戻り変数に関する議論では、チームの一部のメンバーは、呼び出し元に結果を直接返すメソッドを好む一方、他のメンバーは、呼び出し元に返される戻り変数を宣言することを好みます(以下のコード例を参照) 後者の引数は、コードをデバッグしている開発者が、呼び出し元に戻る前にメソッドの戻り値を見つけることができるため、コードが理解しやすくなることです。これは、メソッド呼び出しがデイジーチェーン接続されている場合に特に当てはまります。 どちらが最も効率的であるか、および/または、あるスタイルを別のスタイルよりも採用する必要があるという理由はありますか? ありがとう private bool Is2(int a) { return a == 2; } private bool Is3(int a) { var result = a == 3; return result; }

5
C#とNUnitを使用してGUIアプリの単体テストを構成する方法
簡単なアプリケーションを顧客の1人に提供するために、小さなサイドプロジェクトを行うように依頼されました。通常、テストニーズをすべて把握しているバックエンドコードで作業しますが、GUIのテストを作成することについてまだ疑わしい喜びがありません。 EXEのテストコードとツール。 私の最初の本能は、テストをアプリケーションコードに単純に含めることでしたが、テスト固有の多数の依存関係を提供する必要があり、特に顧客に出荷しないように指示されました。また、専用のテストツール用に現金を絞り込めないため、手元にあるツール(StoryQ、RhinoMocks、およびNUnitを使用する必要があります。)、これは実際に単純なGUIアプリの動作をテストするのに十分なはずです。したがって、私が見る限り、これにより、デザインを本当にシンプルに保つか、テストのために意図的にオーバーエンジニアリングするかのバランスをとろうとしています。別のライブラリでビジネスロジックを使用してアプリを構築し、通常どおりにライブラリに対してテストするか、アプリケーション設計ではない追加のモジュールを壊さずに実行可能ファイルを許可する他のメカニズムを見つけているようです本当に必要。 編集: この質問は、DLLとは対照的に、NUnitと実行可能ファイルの関係を構築する方法に関するものであり、プレゼンテーションとビジネスロジックを分離する方法に関するものではないことに注意してください。 /編集 だから私の質問は: 単純なGUIアプリケーションを単体テストで構成して、手元にあるツールを使用して、過剰なエンジニアリングに頼らずに状態と動作を適切にチェックできるようにする特定の/推奨の方法はありますか? (DLLではなく)EXEをテストするときにNUnitを起動/構成する方法に関する基本的なことを見逃していませんか? このすべてをどのように達成するかの例の方向性を提供または指示できますか? これを行うには複数の方法があるかもしれないことを理解しているので、あなたの経験に基づいて特定の実装ガイドラインを探しています。
16 c#  testing  gui  nunit 

6
C#5非同期再入可能性のソリューション
そのため、C#5の新しい非同期サポートについて何かが私を悩ませています。 ユーザーは、非同期操作を開始するボタンを押します。呼び出しはすぐに戻り、メッセージポンプが再び実行を開始します-それがポイントです。 そのため、ユーザーはボタンを再度押すことができます-再入を引き起こします。これが問題になったらどうしますか? 私が見たデモでは、await呼び出しの前にボタンを無効にし、その後再び有効にします。これは、実際のアプリでは非常に脆弱なソリューションのように思えます。 特定の実行中の操作に対してどのコントロールを無効にする必要があるかを指定するある種のステートマシンをコーディングする必要がありますか?または、より良い方法がありますか? 操作中はモーダルダイアログを表示したいだけですが、これはまるでハンマーを使用しているように感じます。 誰もが明るいアイデアを持っていますか? 編集: 操作の実行中に使用すべきでないコントロールを無効にすると、多くのコントロールを持つウィンドウがあるとすぐに複雑になると思うので、壊れやすいと思います。最初のコーディングとその後のメンテナンスの両方で、バグの可能性を減らすため、物事をシンプルに保つことが好きです。 特定の操作に対して無効にする必要があるコントロールのコレクションがある場合はどうなりますか?また、複数の操作が同時に実行されている場合はどうなりますか?

3
C#5非同期サポートはUIスレッドの同期の問題をどのように支援しますか?
どこかで、C#5 async-awaitは非常に素晴らしいので、これを行うことを心配する必要はないと聞いた: if (InvokeRequired) { BeginInvoke(...); return; } // do your stuff here 待機操作のコールバックは、呼び出し元の元のスレッドで発生するようです。Eric LippertとAnders Hejlsbergは、この機能がUI(特にタッチデバイスUI)の応答性を高める必要性に起因すると何度か述べています。 このような機能の一般的な使用法は次のようになると思います。 public class Form1 : Form { // ... async void GetFurtherInfo() { var temperature = await GetCurrentTemperatureAsync(); label1.Text = temperature; } } コールバックのみが使用される場合、ラベルテキストを設定すると、UIのスレッドで実行されないため、例外が発生します。 これまでのところ、これが事実であることを確認するリソースが見つかりませんでした。誰もこれについて知っていますか?これがどのように機能するかを技術的に説明するドキュメントはありますか? 「はい」と答えるだけでなく、信頼できるソースからのリンクを提供してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.