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

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

2
デタッチされたが等しいオブジェクトを使用して、アタッチされたオブジェクトを更新できますか?
外部APIから映画データを取得します。最初のフェーズでは、各映画をかき取り、自分のデータベースに挿入します。2番目のフェーズでは、APIの「変更」APIを使用してデータベースを定期的に更新します。このAPIをクエリして、情報が変更された映画を確認できます。 私のORMレイヤーはEntity-Frameworkです。Movieクラスは次のようになります。 class Movie { public virtual ICollection<Language> SpokenLanguages { get; set; } public virtual ICollection<Genre> Genres { get; set; } public virtual ICollection<Keyword> Keywords { get; set; } } この問題は、更新が必要な映画がある場合に発生します。私のデータベースは、追跡されているオブジェクトと、更新API呼び出しから受け取った新しいオブジェクトを、を無視して別のオブジェクトと見なし.Equals()ます。 これにより、更新されたムービーでデータベースを更新しようとすると、既存のムービーを更新する代わりにデータベースが挿入されるため、問題が発生します。 以前この言語で問題がありましたが、私の解決策は、アタッチされた言語オブジェクトを検索し、それらをコンテキストから切り離し、それらのPKを更新されたオブジェクトに移動して、それをコンテキストにアタッチすることでした。ときにSaveChanges()今実行され、それは基本的にそれを交換します。 Movieオブジェクトへのこのアプローチを続けると、映画、言語、ジャンル、キーワードを切り離し、データベースでそれぞれを検索し、IDを転送して、新しいオブジェクト。 これをよりエレガントに行う方法はありますか?理想的には、更新されたムービーをコンテキストに渡し、Equals()メソッドに基づいて更新する正しいムービーを選択し、そのすべてのフィールドを更新し、各複雑なオブジェクトを更新したい場合:独自のEquals()メソッドに基づいて既存のレコードを再度使用し、それはまだ存在していません。 アタッチされている.Update()すべてのオブジェクトの取得と組み合わせて使用​​できる各複雑なオブジェクトにメソッドを提供することで、デタッチ/アタッチをスキップできますが、それでも、すべての既存のオブジェクトを取得して更新する必要があります。

2
イベントの送信者は常に汎用オブジェクトである必要がありますか?
C#でイベントをプログラミングするときは、次の形式でデリゲートを作成することをお勧めします。 delegate XEventHandler(object sender, XEventArgs e); 私の質問は、デリゲートの最初の引数ですobject sender。常にジェネリックである必要がありobjectますか?タイプの送信者があると、object常に次のようなコードになります。 val = ((ConcreteType)sender).Property; または、さらに詳細な、 ConcreteType obj = sender as ConcreteType if (obj != null) { ... } 強く型付けされた送信者に対する1つの議論は、他のオブジェクトが型を気にすることなくイベントを転送できることです。これはGUI環境では理にかなっているかもしれませんが、GUI以外でもメリットがあるかどうかはわかりません。 送信者のクラスが常に(少なくとも抽象クラスとして)わかっている場合はどうなりますか?私は実装していますたとえば、ListChanged抽象的にイベントをListクラス、および他のクラスは、(例えば、それを継承しようとしている場合はLinkedList、ArrayList)、それはタイプの送信者と私のデリゲートを定義するために、すべての権利でありますかList? delegate ListChangedEventHander(List sender, ListChangedEventArgs e); または、従来型object senderをより具体的なタイプに変更することの欠点はありますか?
10 c#  event 

1
C#5.0の非同期関数と通常の関数の間の線をぼかす
最近、C#5.0の驚くべき非同期待機パターンを十分に理解できていないようです。あなたは私の人生のどこにいましたか? 単純な構文には本当に感激していますが、小さな難しさがあります。私の問題は、非同期関数の宣言が通常の関数とはまったく異なるということです。他の非同期関数で待機できるのは非同期関数だけなので、古いブロックコードを非同期に移植しようとすると、変換しなければならない関数のドミノ効果があります。 人々はこれをゾンビの蔓延と呼んでいます。asyncがコードに噛み付くと、ますます大きくなります。移植プロセスは難しくありません。async宣言をスローし、戻り値をでラップするだけTask<>です。しかし、古い同期コードを移植するときに、これを何度も繰り返すのは面倒です。 両方の関数タイプ(asyncとplain old sync)がまったく同じ構文を持っていると、はるかに自然に思えます。これが事実であった場合、移植はゼロの労力で済み、2つの形式を簡単に切り替えることができます。 私はこれらのルールに従えばこれはうまくいくと思います: 非同期関数はasync宣言を必要としなくなります。それらの戻り値の型をにラップする必要はありませんTask<>。コンパイラは、コンパイル時に非同期関数を単独で識別し、必要に応じてTask <>ラッピングを自動的に実行します。 非同期関数の呼び出しを忘れることはありません。非同期関数を呼び出したい場合は、それを待つ必要があります。私はとにかくファイアアンドフォーゲットをほとんど使用していません。クレイジーレースコンディションやデッドロックのすべての例は、常にそれらに基づいているようです。私はそれらが私たちが活用しようとしている同期の考え方とあまりに混乱していて「連絡がない」と思います。 本当に忘れずに生きられないのなら、それのための特別な構文があります。いずれにせよ、それは私が話している単純な統一構文の一部にはなりません。 非同期呼び出しを示す必要がある唯一のキーワードはawaitです。待機している場合、呼び出しは非同期です。そうでない場合、呼び出しは従来の同期になります(覚えておく必要はありません)。 コンパイラーは非同期関数を自動的に識別します(関数には特別な宣言がなくなるため)。ルール4では、これを非常に簡単に行うawaitことができます。関数の内部に呼び出しがある場合、関数は非同期です。 これでうまくいきますか?または私は何かを逃していますか?この統一された構文ははるかに流動的で、ゾンビの蔓延を完全に解決できます。 いくつかの例: // assume this is an async function (has await calls inside) int CalcRemoteBalanceAsync() { ... } // assume this is a regular sync function (has no await calls inside) int CalcRemoteBalance() { ... } // …

6
変数が使用される場所の近くで宣言するのはなぜですか?
変数はできる限り使用に近い場所で宣言する必要があると人々が言うのを聞いたことがあります。分かりません。 たとえば、このポリシーでは、これを行う必要があることを示唆しています。 foreach (var item in veryLongList) { int whereShouldIBeDeclared = item.Id; //... } しかし、これは確かに新しいintものを作成するオーバーヘッドがすべての反復で発生することを意味します。使用した方がいいでしょう: int whereShouldIBeDeclared; foreach (var item in veryLongList) { whereShouldIBeDeclared = item.Id; //... } 誰か説明してもらえますか?
10 c#  .net  variables 

4
意図的に例外を発生させてキャッチを使用する
if...else例外処理でラップされた通常の場合、次の例のようなものはコードの重複を避けるための推奨される方法ですか? try { if (GetDataFromServer()) { return ProcessData(); } else { throw new Exception(); } catch(Exception ex) { return null; } の代わりに... try { if (GetDataFromServer()) { return ProcessData(); } else { return null; } } catch(Exception ex) { return null; } パフォーマンスにわずかな影響があることは知っていますが、これが許容できるプラクティスであると考えられるかどうか疑問に思っています。私は現在、2番目の方法(特に、特定の例外を異なる方法で処理する必要がある場合)を実行していますが、最初の方法が単純なケースに適しているかどうか疑問に思っていました。

2
C#プログラミング言語での変数の命名規則[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 6年前休業。 変数に関するC#のビデオを見ています。著者はメソッド内で変数を宣言し、次のように名前を付けました。string MyName = "James"; 私の質問は、.Net Frameworkが推奨する規則です。上記の例のようなパスカルケースですか、それともキャメルケースですか?

4
関数内での内部スコープブロックの使用は悪いスタイルですか?
以下のリスクがあるいくつかの(かなりまれな)ケースがあります。 再利用を目的としていない変数の再利用(例1を参照)、 または、別の変数の代わりに変数を使用して、意味的に近い(例2を参照)。 例1: var data = this.InitializeData(); if (this.IsConsistent(data, this.state)) { this.ETL.Process(data); // Alters original data in a way it couldn't be used any longer. } // ... foreach (var flow in data.Flows) { // This shouldn't happen: given that ETL possibly altered the contents of `data`, it is …

2
数字で始まる文字列を表す適切な名前付け
Windowsのいくつかのカメラメタデータを見るFile Propertiesと、(さらにいくつかの)2つのProperties名前付き焦点距離と35mm焦点距離があります。 私はこれら2つを利用するソフトウェアを開発していますProperties。これまでのところ、最初のProperty名前FocalLengthを作成しましたが、他の名前の適切な名前を見つけることができません。 私が考えている_35MmFocalLengthかThirtyFiveMmFocalLength、私はより良い提案があるかもしれないと思います。 何か案は?

4
C#でアンマネージセーフコードを使用しないのはなぜですか
C#には、チェックされていないコードを実行するオプションがあります。マネージコードの方がはるかに安全であり、多くの問題を克服できるため、通常はそうすることはお勧めしません。 ただし、コードでエラーが発生しないことが確かで、メモリの処理方法がわかっている場合、なぜ(高速コードが好きな場合)なぜ一般的なアドバイスに従うのでしょうか。 非常に高速なビットマップ操作を必要とするビデオカメラ用のプログラムを書いたので、これは不思議に思っています。私はいくつかの高速グラフィカルアルゴリズムを自分で作成し、アンマネージコードを使用してビットマップ上で優れた動作をしました。 一般的に、メモリリークやクラッシュのリスクがないことが確かな場合は、アンマネージコードをより頻繁に使用しないのはなぜでしょうか。 PS私の経歴:このプログラミングの世界に少し入って、私は一人で(数年はそうしています)、このソフトウェア設計の質問がそれほど奇妙ではないことを願っています。先生のように、そんなことを聞​​いてくれる人はあまりいません。

3
C#のプライベート静的メソッドは何かを傷つけますか?
クラスで複数回発生する特定の検証用のプライベート検証メソッドを作成しました(検証されたデータをさまざまな理由で保存できません)。現在、ReSharperは、関数を静的にできることを示唆しています。静的メソッドの既知の問題のため、そうすることに少し消極的です。それはプライベート静的メソッドになります。私の質問は、プライベート静的メソッドは、パブリック静的メソッドのような同様の結合とテストの問題を引き起こす可能性があるのですか?それは悪い習慣ですか?私はそうは思いませんが、ここに落とし穴があるかどうかはわかりません。

3
Entity FrameworkのDataContextオブジェクトを作成して、各CRUDメソッドのusingブロックに配置しても問題ありませんか?
次の機能を実装するwpfアプリケーションを構築しています。 ユーザー入力を取得し、データベースからデータを読み取る それにいくつかの計算を行います 複数のタイプのビューでユーザーにそれを紹介し、変更をデータベースに書き込みます 提案されたアーキテクチャ:データベース->エンティティフレームワーク->リポジトリ->ビジネスロジック->データサービス-> ViewModel このアーキテクチャを使用する理由:アプリケーション(複数のビュー)と複数のデータベースに存在する複数のシナリオ。したがって、私は抽象化のために真ん中にリポジトリを使用する用意があります。 注意点の1つは、リポジトリが実装されている場合、コンテキストは長期間有効であることです。これを克服するために、コンテキストを作成し、それらを各クラッドメソッドのusing()ブロックに配置しても問題ありませんか? 別のアプローチを提案すること自由に感じなさい。
10 c#  design  architecture  wpf 

2
LINQ selectのBig O等価
代わりにLINQ選択を使用すると、ネストされたループのBig O等価に変更があるかどうかを確認しようとしています。 public void myFunc(List<Foo> fooList, List<Bar> barList) { foreach(Foo foo in fooList) { foreach(Bar bar in barList) { if(foo.PropA == bar.PropA && bar.PropZ.HasValue) foo.PropC = foo.PropB * bar.PropZ; } } } このネストされたループの例は、複雑さのためにO(n ^ 2)であると思います。 ネストされたループを次のようなLINQ選択に置き換えました。 public void myFunc(List<Foo> fooList, List<Bar> barList) { foreach(Foo foo in fooList) { Bar bar …
10 c#  big-o 

3
コンピュータが数学演算で同じ結果を得るようにするには、固定小数点を使用する必要がありますか?
最近のほとんどのコンピューターは同じ浮動小数点標準に従っていると言われましたが、これは、入力が同じであれば、指定された数学演算ですべて同じ浮動小数点数の答えが得られるということですか? 私はネットワーク上でRTSゲームを作成することを研究していて、何百ものユニットの位置を同期するのは悪い方法のように聞こえるので、私は尋ねます。 したがって、入力のみを送信する場合、すべてのクライアントがこれらの入力からシミュレーションを実行することで同じ結果が得られることを保証する必要があります。 古いRTSゲームでは固定小数点演算が使用されていたと読みましたが、すべてが同じ標準に準拠している場合、現代のコンピューターでもそれが必要かどうかわかりません。また、不正確ではありますが、浮動小数点の結果は同じ入力に対して確定的であるとも言われました(これは、同じ標準に従うすべてのコンピューターが同じ不正確な結果を取得することを意味します)。 同じ浮動小数点の基準に従っても、コンピューターに偏差がありますか? 私はこのゲームをC#で書いていますが、それが重要かどうかはわかりません。

3
関数型プログラミングで代入演算子またはループの使用が推奨されないのはなぜですか?
私の関数が2つの要件を満たしている場合、Sum リスト内の項目の合計を返す関数は、特定の条件に対して項目がtrueと評価され、純粋な関数と呼ばれる資格があると思いますか? 1)特定のi / pのセットに対して、関数が呼び出された時間に関係なく、同じo / pが返されます 2)副作用はありません public int Sum(Func<int,bool> predicate, IEnumerable<int> numbers){ int result = 0; foreach(var item in numbers) if(predicate(item)) result += item; return result; } 例: Sum(x=>x%2==0, new List<int> {1,2,3,4,5...100}); 私がこの質問をしている理由は、必須のプログラミングスタイルであるため、代入演算子とループを回避するようアドバイスしている人がほとんどいるためです。では、関数プログラミングのコンテキストでループと代入演算子を使用する上記の例で何が問題になるのでしょうか?

3
For-ifアンチパターン
for-ifアンチパターンについてこのブログ投稿を読んでいましたが、なぜそれがアンチパターンであるのか理解できません。 foreach (string filename in Directory.GetFiles(".")) { if (filename.Equals("desktop.ini", StringComparison.OrdinalIgnoreCase)) { return new StreamReader(filename); } } 質問1: それが理由であるreturn new StreamReader(filename);内部for loop?または、forこの場合ループが必要ないという事実ですか? ブログの作者が指摘したように、これのクレイジーでないバージョンは次のとおりです: if (File.Exists("desktop.ini")) { return new StreamReader("desktop.ini"); } の作成前にファイルが削除されるとStreamReader、を取得するため、どちらも競合状態になりますFile­Not­Found­Exception。 質問2: 2番目の例を修正するには、ifステートメントなしで書き直し、代わりにをStreamReadertry-catchブロックで囲み、それがスローされるFile­Not­Found­Exception場合は、それにcatch応じてブロックで処理しますか?

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