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

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

5
キャッシングを管理するためにクラス内のSRPに違反しないようにする方法は?
注:コードサンプルはc#で記述されていますが、それは問題ではありません。適切なものを見つけることができないため、c#をタグとして配置しました。これはコード構造についてです。 Clean Codeを読んで、より良いプログラマーになろうとしています。 私はしばしば、単一の責任原則(クラスと関数は1つのことだけを行うべきです)、特に関数に従うことに苦労しています。たぶん私の問題は、「一つのこと」が明確に定義されていないことですが、それでも... 例:データベースにFluffiesのリストがあります。Fluffyが何であるかは気にしません。クラスに綿毛を回復させたい。ただし、綿毛はいくつかのロジックに従って変化する可能性があります。いくつかのロジックに応じて、このクラスはキャッシュからデータを返すか、データベースから最新のデータを取得します。毛羽立ちを管理していると言えますが、それは一つのことです。簡単にするために、ロードされたデータが1時間有効であり、それを再ロードする必要があるとしましょう。 class FluffiesManager { private Fluffies m_Cache; private DateTime m_NextReload = DateTime.MinValue; // ... public Fluffies GetFluffies() { if (NeedsReload()) LoadFluffies(); return m_Cache; } private NeedsReload() { return (m_NextReload < DateTime.Now); } private void LoadFluffies() { GetFluffiesFromDb(); UpdateNextLoad(); } private void UpdateNextLoad() { m_NextReload = DatTime.Now …

2
複数のデータベースタイプをサポートするために、抽象データベースインターフェイスはどのように作成されますか?
MySQL、SQLLite、MSSQLなどのいくつかのタイプのデータベースとインターフェイスできる、より大きなアプリケーションで抽象クラスをどのように設計し始めますか? このデザインパターンは何と呼ばれ、どこで正確に始まりますか? 次のメソッドを持つクラスを書く必要があるとしましょう public class Database { public DatabaseType databaseType; public Database (DatabaseType databaseType){ this.databaseType = databaseType; } public void SaveToDatabase(){ // Save some data to the db } public void ReadFromDatabase(){ // Read some data from db } } //Application public class Foo { public Database db = new …
12 c#  database 

5
連続していないアレイはパフォーマンスが良いですか?
C#では、ユーザーがを作成しList<byte>てバイトを追加すると、スペースが不足し、さらにスペースを割り当てる必要がある可能性があります。以前の配列のサイズの2倍(または他の乗数)を割り当て、バイトをコピーし、古い配列への参照を破棄します。私は、各割り当てが高価であるため、リストが指数関数的に増加することを知っていて、これはそれを制限O(log n)だけ追加配分、10余分な項目ににつながるたびO(n)配分を。 ただし、配列サイズが大きい場合、多くの無駄なスペースが存在する可能性があり、おそらく配列のほぼ半分になります。メモリを削減するために、リストに4MB未満がある場合にバッキングストアとしてNonContiguousArrayList使用する同様のクラスを作成し、サイズが大きくなるとList<byte>追加の4MBバイト配列を割り当てNonContiguousArrayListます。 異なりList<byte>、これらの配列が非連続であるので、周りのデータのないコピー、単に追加の4Mの割り当てはありません。アイテムが検索されると、インデックスは4Mで除算されてアイテムを含む配列のインデックスが取得され、4Mを法として配列内のインデックスが取得されます。 このアプローチの問題を指摘できますか?私のリストは次のとおりです。 不連続な配列にはキャッシュの局所性がないため、パフォーマンスが低下します。ただし、4Mのブロックサイズでは、適切なキャッシングに十分なローカリティがあるようです。 アイテムへのアクセスはそれほど単純ではなく、間接的なレベルが余分にあります。これは最適化されますか?キャッシュの問題が発生しますか? 4Mの制限に達すると線形に増加するため、通常よりも多くの割り当てを行うことができます(たとえば、1 GBのメモリに対して最大250の割り当て)。4M以降は追加のメモリはコピーされませんが、追加の割り当てがメモリの大きなチャンクをコピーするよりも高価かどうかはわかりません。
12 c# 

2
ソースコードでAPIキーを非表示にする最良の方法
アプリケーション、特にac#.NETアプリケーションでプライベートAPIキーを保護する方法についてのアイデアが必要です。 まず、ソースコードに何かを隠すことは理論的に不可能であることを理解しているので、別のアイデアを思いつきましたが、それがどれほど妥当かはわかりません。とにかく、なんらかの方法でWebサーバーと通信して秘密鍵を検証し、アプリケーションに戻って正当なハンドシェイクであることを確認することは可能でしょうか? 作業する2つのキーがあります。公開キー(名前が示すように、プライベートと同じように扱う必要はありません)と、他から保護されている必要があるプライベートキーです。 私がこれをどのように行うことができるかについてのアイデアは大歓迎です。
12 c#  api  authentication 

9
継承のための設計はどのように余分なコストを引き起こすことができますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 だから私はsealed classインシャープから継承したいと思い、やけどを負った。ソースにアクセスできない限り、封印を解除する方法はありません。 それから、「なぜsealed存在するのか」と考えさせられました。4ヶ月前。次のような多くのことを読んだにもかかわらず、私はそれを理解できませんでした。 Jon Skeetの願いは、「クラスは.NETでデフォルトで封印されました。」 継承よりも構成を優先しますか? 「すべてのクラスを封印するべきではありません(...)」 Sealedクラスをどのようにモックしますか? それ以来、すべてを消化しようとしましたが、それは私にとってはやりすぎです。最終的に、昨日私はそれをもう一度試しました。私はそれらすべてをもう一度スキャンし、さらにいくつかをスキャンしました: クラスが「抽象」または「最終/封印」以外のものでなければならないのはなぜですか? 15年以上のプログラミングで、すでにリンクされている質問からの答えのうち、最初にSOLIDを聞いたことがあり、明らかに4ヶ月前にそれをすべて読んでいませんでした 最後に、熟考した後、新しいタイトルに基づいて元の質問を大幅に編集することにしました。 古い質問が広すぎると主観的でした。それは基本的に尋ねていました: 旧称:シールを使用する1つの正当な理由 本文:シールクラスを適切に変更する方法 継承を忘れますか?コンポジションを使用しますか? しかし、今、理解すること(私は昨日なかった)すべてのsealed継承を阻止されず、そして私たちは、実際に使用する必要がありますすることができます継承上の組成を、私は私がした必要なものを実現実用例。 私はここに私の質問は正確に何を(実際には常にされている)であると思いMr.Mindorはチャットで私の提案:どのように余分なコストの原因継承のために設計することができますか?
12 c#  inheritance 

4
どのプロパティが値を変更し、どのプロパティが一定のままであるかが明確になるように、どのようにインターフェイスを設計しますか?
.NETプロパティに関する設計上の問題があります。 interface IX { Guid Id { get; } bool IsInvalidated { get; } void Invalidate(); } 問題: このインターフェイスには、2つの読み取り専用プロパティとがIdありIsInvalidatedます。ただし、それらが読み取り専用であるという事実は、それらの値が一定のままであることを保証するものではありません。 それを非常に明確にすることが私の意図だったとしましょう… Id 定数値を表します(したがって、安全にキャッシュできます)。 IsInvalidatedIXオブジェクトの存続期間中にその値を変更する可能性があります(したがって、キャッシュすべきではありません)。 interface IXその契約を十分に明確にするためにどのように変更できますか? 私自身の解決策の3つの試み: インターフェイスはすでに適切に設計されています。呼び出されたメソッドの存在Invalidate()により、プログラマは、同様の名前のプロパティの値IsInvalidatedが影響を受ける可能性があることを推測できます。 この引数は、メソッドとプロパティの名前が似ている場合にのみ有効です。 このインターフェースをイベントで拡張しますIsInvalidatedChanged: bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged; の…Changedイベントの存在は、IsInvalidatedこのプロパティがその値を変更する可能性があることを示し、同様のイベントが存在しないことは、Idそのプロパティがその値を変更しないという約束です。 私はこのソリューションが好きですが、それはまったく使われないかもしれない追加のものがたくさんあります。 プロパティIsInvalidatedをメソッドに置き換えますIsInvalidated(): bool IsInvalidated(); これはあまりにも微妙な変更かもしれません。値は毎回新しく計算されるというヒントになるはずです-定数である場合は必要ありません。MSDNのトピック「プロパティとメソッドの選択」には、次のように書かれています。 次の状況では、プロパティではなくメソッドを使用してください。[…]パラメータが変更されていなくても、操作は呼び出されるたびに異なる結果を返します。 どのような答えが期待できますか? 私は、問題に対するまったく異なる解決策と、上記の試みをどのように打ち負かすかについての説明に最も興味があります。 私の試みが論理的に欠陥があるか、まだ言及されていない重大な欠点があり、解決策が1つしか残っていない(または何も残っていない)場合、どこで間違ったのかを聞きたいと思います。 欠陥が軽微であり、それを考慮した後、複数の解決策が残っている場合は、コメントしてください。 少なくとも、どちらがあなたの優先解決策であり、どのような理由であるかについてのフィードバックをお願いします。
12 c#  design  .net  properties 

5
思考をC ++からC#に移行する方法
私は経験豊富なC ++開発者であり、言語を非常に詳細に知っており、その特定の機能の一部を集中的に使用しました。また、私はOODの原則とデザインパターンを知っています。私は今C#を学んでいますが、C ++の考え方を取り除くことができないという気持ちを止めることはできません。私はC ++の強みに一生懸命縛り付けたので、いくつかの機能がなければ生きられません。また、C#でそれらの適切な回避策または代替策を見つけることができません。 どのような良いプラクティス、デザインパターン、イディオム C ++の観点から、C#で異なっているあなたは提案することができますか?C#で馬鹿げていない完璧なC ++デザインを取得するにはどうすればよいですか? 具体的には、対処するC#風の良い方法を見つけることができません(最近の例): 確定的なクリーンアップを必要とするリソース(ファイルなど)の有効期間を制御します。これは簡単usingに手に入れることができますが、リソースの所有権が転送されているときに適切に使用する方法[... betwen threads]?C ++では、単に共有ポインタを使用して、適切なタイミングで「ガベージコレクション」を処理します。 特定のジェネリックの関数をオーバーライドすることに常に苦労しています(C ++での部分的なテンプレートの特殊化などが大好きです)。C#でジェネリックプログラミングを行う試みを放棄する必要がありますか?ジェネリックは意図的に制限されている可能性があり、特定の問題領域を除いてジェネリックを使用するのはC#っぽくないですか? マクロのような機能。一般に悪い考えですが、問題の一部の領域では、他の回避策はありません(たとえば、デバッグリリースにのみ送信されるログのように、ステートメントの条件付き評価)。それらを持たないということは、if (condition) {...}定型文を追加する必要があることを意味しますが、副作用を引き起こすという点ではまだ同じではありません。

4
C#最小SQLデータベース
私は、CSVのようなものでは処理が効率的でなく、SQL / MySQLサーバーが多すぎるほど十分なデータを保存する必要がある小さなプロジェクト(本番ではない)に取り組んでいます。.Netには、単一のファイルを読み込んで処理するのではなく、サーバーを管理および接続することなく、クエリ機能を使用して、データの複数のエントリを効率的に保存する方法がありますか。
12 c#  database  sql 

2
クラス、列挙型、およびその他のエンティティを個別のファイルに配置する必要がありますか?
私の会社のチームリーダー\アーキテクトは、「ロジックで接続されたエンティティ」が1つの.csファイルに配置されていると、大規模プロジェクトの方が理解しやすいと主張しています。 私は引用する: 「ロジックとインターフェースとクラスの構造全体を1か所で見ることができます。これは反論の余地のない議論です。同じことを見るために、ツールを使用するために必要なファイルがたくさんあります図、ナビゲーション用のR#など」 「貧弱な理論に従って、分離したファイルの軍隊はクールだと叫ぶかもしれませんが、既存のコードに変更を加えることになると、特にこのコードの作成者ではない場合、たくさんの散在するファイルを理解することは非常に困難です。フォーラムでは、「1つの列挙-1つのファイル」と書くことができますが、実際にはこのアプローチは決して使用すべきではありません 「...開発者間でのコードベースの分離に関しては、現在では同じファイルを同時に編集することは問題ではありません。マージは問題ではありません。」 列挙型、クラスなどごとに1つの.csファイルを作成する必要があることを何度も耳にし、読んでいます。これがベストプラクティスです。 しかし、私は彼を納得させることはできません。彼は、Jon Skeetのような有名なプログラマーを信頼していないと言います。ところで、このトピックに関するスキートの意見は次のとおりです。列挙型を見つけるのに最適な場所はどこですか? どう思いますか?本当の問題はありますか?または、それは趣味の問題であり、組織のコーディング標準によって規制されるべきですか?

4
ファイル形式を作成する適切な方法はありますか?
C#.NETで記述したアプリケーション用に独自のファイル形式を作成して、保存情報を保存し、おそらくプロジェクトの資産を保存します。何らかの方法でこれを行う方法の基準はありますか?私は単純に行っていたSerializeバイナリに私のオブジェクトとどのようにファイルを解析するために私に言うだろうヘッダを作成します。これは悪いアプローチですか?

3
LINQはどのような問題領域のために作られていますか?
C#のStack Overflowに投稿された質問を見るたびに、LINQの問題を解決する少なくとも1つまたは2つの回答が投稿されます。通常、非常に高い評価を得ている人々は、プロのようにLINQを使用しているようです。 だから私の質問は、どの問題ドメインがLINQを使用することになっていますか? サイドノートにも:それを避けるべき目的はありますか?データセットのサイズはLINQクエリのパフォーマンスに影響しますか?

3
ファーストクラスのライブラリを出荷しています。知っておく必要がある落とし穴はありますか?
私は自分のキャリアで「ファーストクラスライブラリ公開」の成果を解き明かそうとしているWeb開発者です。コミュニティの経験を活用して、可能な限りスムーズに進むための提案や推奨事項があるかどうかを確認したいと思います。知っておく必要のある詳細や落とし穴はありますか?ビルドプロセスについて何か特別なことはありますか? 私がいる場所は次のとおりです。 ライブラリはユニットテストされており、約97%のコードカバレッジがあります。 APIは十分に文書化されており、インテリセンスサポートのxmlドキュメントが作成されています パブリック/プライベートクラスアクセサーが正確かつ正しいことを確認しました。すべてのゲッター/セッターについても同じことが言えます エラー処理は私が望んでいるほど優雅ではありませんが、私は締め切りに間に合っており、今のところ「それがうまくいく」ことを受け入れています わかりやすいログはありません。Debug.Writelineが広く使用されていました...最近、これが私の経験不足を反映していることがわかりました:( あなたのアドバイスは大歓迎です! ライブラリはレポートの生成に使用されます。標準の帽子-読み取り専用データベースに接続し、計算を実行し、データをフォーマットし、応答ストリームに出力します。 私は、辞めたプログラマーの一人を補うためのフリンジリソースとしてタップされ、このタスクは「歯を切る」プロジェクトとして私に与えられました。クラスライブラリは、プロダクションコードを記述するときに使用する社内の他のプログラマ向けにリリースされる予定です。

5
唯一のロジックがガードである単体テストメソッドは便利ですか?
次のような方法があるとします。 public void OrderNewWidget(Widget widget) { if ((widget.PartNumber > 0) && (widget.PartAvailable)) { WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber); } } 私のコードにはそのようなメソッドがいくつかあります(非同期Webサービス呼び出しの前半分)。 それらを単体テストでカバーすることが有用かどうかを議論しています。はい、ここにはロジックがありますが、それはガードロジックにすぎません。(つまり、Webサービスの呼び出しを許可する前に、必要なものがあることを確認します。) 私の一部は、「あなたはそれらをユニットテストできることを確認しますが、それは時間の価値がありません」と言います(私はすでに予定より遅れているプロジェクトにいます)。 しかし、私の反対側は、もしあなたがそれらを単体テストしないで、誰かが衛兵を変えれば、問題があるかもしれないと言います。 しかし、私の最初の部分は、誰かがガードを変更した場合、あなたは彼らのためにもっと仕事をしているだけだと言います(ガードとガードのユニットテストを変更しなければならないからです)。 たとえば、私のサービスがウィジェットの可用性をチェックする責任を負う場合、そのガードをこれ以上望まないかもしれません。単体テスト中の場合は、2つの場所を変更する必要があります。 私は両方の面で賛否両論を見ています。だから私は他の人が何をしたかを尋ねると思った。
12 c#  unit-testing 

4
新しいオブジェクトに割り当てるときのスイッチまたは辞書
最近、ステートメントのDictionaries代わりに1-1の関係をマッピングすることを好むようになりましたSwitch。書くのが少し速く、精神的に処理するのが簡単だと思います。残念ながら、オブジェクトの新しいインスタンスにマッピングするとき、次のように定義したくありません。 var fooDict = new Dictionary<int, IBigObject>() { { 0, new Foo() }, // Creates an instance of Foo { 1, new Bar() }, // Creates an instance of Bar { 2, new Baz() } // Creates an instance of Baz } var quux = fooDict[0]; // quux references Foo …
12 c#  coding-style 

2
n層Entity Frameworkソリューションによる依存性注入
現在、データアクセス戦略としてEntity Framework 5(.net 4)を使用しているn層ソリューションを設計していますが、依存性注入を組み込んでテスト可能/柔軟にする方法を検討しています。 私の現在のソリューションレイアウトは次のとおりです(私のソリューションはAlcatrazと呼ばれます)。 Alcatraz.WebUI:asp.net webformプロジェクト、フロントエンドユーザーインターフェイスは、プロジェクトAlcatraz.BusinessおよびAlcatraz.Data.Modelsを参照します。 Alcatraz.Business:クラスライブラリプロジェクト。ビジネスロジックを含み、プロジェクトAlcatraz.Data.Access、Alcatraz.Data.Modelsを参照します。 Alcatraz.Data.Access:クラスライブラリプロジェクトは、AlcatrazModel.edmxとAlcatrazEntitiesDbContextを収容し、プロジェクトAlcatraz.Data.Modelsを参照します。 Alcatraz.Data.Models:クラスライブラリプロジェクト。AlcatrazモデルのPOCOを含み、参照はありません。 このソリューションがどのように機能するかについての私のビジョンは、web-uiがビジネスライブラリ内のリポジトリをインスタンス化することです。このリポジトリは(コンストラクタを介して)接続文字列(AlcatrazEntitiesインスタンスではなく)の依存関係を持ちます。web-uiはデータベース接続文字列を知っていますが、それがエンティティフレームワーク接続文字列であることはわかりません。 ビジネスプロジェクトで: public class InmateRepository : IInmateRepository { private string _connectionString; public InmateRepository(string connectionString) { if (connectionString == null) { throw new ArgumentNullException("connectionString"); } EntityConnectionStringBuilder connectionBuilder = new EntityConnectionStringBuilder(); connectionBuilder.Metadata = "res://*/AlcatrazModel.csdl|res://*/AlcatrazModel.ssdl|res://*/AlcatrazModel.msl"; connectionBuilder.Provider = "System.Data.SqlClient"; connectionBuilder.ProviderConnectionString = connectionString; _connectionString = …

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