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

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

10
ダウンキャストの適切な使用とは何ですか?
ダウンキャストとは、基本クラス(またはインターフェイス)からサブクラスまたはリーフクラスにキャストすることです。 ダウンキャストの例は、System.Object他のタイプにキャストする場合です。 ダウンキャストは人気がありませんが、コードの匂いかもしれません。例えば、オブジェクト指向の教義は、ダウンキャストの代わりに仮想メソッドまたは抽象メソッドを定義して呼び出すことを好むことです。 ダウンキャストの適切で適切なユースケースは、もしあれば、何ですか?つまり、ダウンキャストするコードを書くことが適切なのはどのような状況ですか? 答えが「なし」である場合、ダウンキャストが言語でサポートされているのはなぜですか?

7
関数が意図した動作を実行する前にnullチェックを実行する必要がある場合、これは悪い設計ですか?
だから、これが良いコード設計なのか悪いコード設計なのかはわからないので、私は尋ねた方が良いと思った。 クラスを含むデータ処理を行うメソッドを頻繁に作成し、メソッドで多くのチェックを行って、null参照やその他のエラーを事前に取得しないようにします。 非常に基本的な例: // fields and properties private Entity _someEntity; public Entity SomeEntity => _someEntity; public void AssignEntity(Entity entity){ _someEntity = entity; } public void SetName(string name) { if (_someEntity == null) return; //check to avoid null ref _someEntity.Name = name; label.SetText(_someEntity.Name); } そのため、毎回nullをチェックするimを見ることができます。しかし、メソッドはこのチェックを行うべきではありませんか? たとえば、外部コードが事前にデータをクレンジングして、メソッドが以下のように検証する必要がないようにする必要があります。 if(entity != null) // this …
67 c#  design  validation 

16
プログラマーは、言語とフレームワークをどの程度自由に選択できますか?
私は主にC#指向の会社で働き始めました。JavaとJRubyが好きな人は数人いますが、ここではC#が好きなプログラマーの大部分です。私が雇われたのは、Webアプリケーションの構築に多くの経験を持ち、JRuby on Railsやnodejsのような新しいテクノロジーに傾倒したためです。 私は最近、短時間で多くのことを成し遂げることに重点を置いて、Webアプリケーションを構築するプロジェクトに着手しました。ソフトウェアリーダーは、レールの代わりにmvc4を使用するよう指示しています。私はmvc4を知らない、C#を知らない、そしてWebアプリケーションサーバーとフロントエンドUIを作成する責任があるのは私だけである以外は、それは大丈夫かもしれません。 mvc4を使用する代わりに、私がすでに非常によく知っているフレームワーク(Rails)を使用することは意味がありませんか?この決定の背後にある理由は、技術リーダーがJruby / railsを知らず、コードを再利用する方法がないことでした。 カウンター引数: 彼はコードに貢献することはなく、率直に言って、 このプロジェクトには必要ありません。そのため、彼がJRuby / railsを知っているかどうかは重要ではありません。 JRubyがコードをプルしたり、その逆を行うことができる多くのJavaアプリがあるため、実際にコードを再利用できます。実際、彼はJavaライブラリをJRuby on Railsアプリで実行するだけでなく、JavaライブラリをC#に変換するためのリソースをいくつか用意しています。彼はJavaやJRubyが好きではないからです 多くのWebアプリケーションを作成しましたが、なじみのないものを使用するとスピンアップが発生し、今までのように短時間で素晴らしいアプリケーションを作成することができません。これは問題ありません。この分野では新しい技術を学ぶことが重要です。問題は、このプロジェクトでは、多くのことを迅速に行う必要があるということです。 開発者はどの時点でツールを選択できますか?これは会社に依存していますか?私の会社は嫌ですか、これは正常と考えられていますか?環境に優しい牧草地はありますか?私はこれを間違った方法で見ていますか?

12
引数を検証するコンストラクターはSRPに違反しますか?
私は可能な限り単一責任原則(SRP)に準拠しようとしていますが、デリゲートに大きく依存する特定のパターン(メソッドのSRP)に慣れました。このアプローチが適切かどうか、または深刻な問題があるかどうかを知りたいです。 たとえば、コンストラクターへの入力を確認するために、次のメソッドを導入できます(Stream入力はランダムで、何でも可能です) private void CheckInput(Stream stream) { if(stream == null) { throw new ArgumentNullException(); } if(!stream.CanWrite) { throw new ArgumentException(); } } このメソッドは(おそらく)複数のことを行います 入力を確認する さまざまな例外をスローする したがって、SRPを順守するために、ロジックを private void CheckInput(Stream stream, params (Predicate<Stream> predicate, Action action)[] inputCheckers) { foreach(var inputChecker in inputCheckers) { if(inputChecker.predicate(stream)) { inputChecker.action(); } } } たぶん1つのことだけを行う(行うのか?):入力を確認する。入力の実際のチェックと例外のスローのために、次のようなメソッドを導入しました bool …

12
エラーをスローすべきかどうかを示すフラグを持っている
私は最近、かなり古い開発者(50歳以上)がいる場所で働き始めました。彼らは、システムがダウンすることができなかった航空を扱う重要なアプリケーションに取り組んできました。その結果、古いプログラマーはこの方法でコーディングする傾向があります。 彼は、オブジェクトにブール値を入れて、例外をスローすべきかどうかを示す傾向があります。 例 public class AreaCalculator { AreaCalculator(bool shouldThrowExceptions) { ... } CalculateArea(int x, int y) { if(x < 0 || y < 0) { if(shouldThrowExceptions) throwException; else return 0; } } } (このプロジェクトでは、その時点では存在できないネットワークデバイスを使用しようとしているため、メソッドは失敗する可能性があります。エリアの例は、例外フラグの例にすぎません) 私にはこれはコードの匂いのようです。毎回例外フラグをテストする必要があるため、単体テストの作成は少し複雑になります。また、何か問題が発生した場合、すぐに知りたいと思いませんか?続行方法を決定するのは呼び出し側の責任ではないでしょうか? 彼の論理/推論は、プログラムがユーザーにデータを表示するという1つのことをする必要があるということです。それを妨げないその他の例外は無視する必要があります。私はそれらが無視されるべきではないことに同意しますが、バブルアップして適切な人によって処理されるべきであり、そのためのフラグを処理する必要はありません。 これは例外を処理する良い方法ですか? 編集:設計上の決定についてより多くのコンテキストを与えるために、このコンポーネントが失敗した場合でも、プログラムは引き続き動作し、メインタスクを実行できるためだと思います。したがって、例外をスローしたくない(そして、それを処理しない?)ので、ユーザーが正常に動作しているときにプログラムを停止させます 編集2:より多くのコンテキストを与えるために、この場合、メソッドはネットワークカードをリセットするために呼び出されます。ネットワークカードが切断および再接続され、異なるIPアドレスが割り当てられると問題が発生します。したがって、古いIPでハードウェアをリセットしようとするため、リセットは例外をスローします。

11
ANSI Cが私たちの新しいプロジェクトには不十分であると上司に納得させるにはどうすればよいですか?[閉まっている]
数か月前、社内で開発されたテスト機器を制御し、一連の測定値を記録するアプリの開発を開始しました。シンプルなUIが必要です。また、継続的な記録が必要なため、スレッドが必要になる可能性があります。このアプリケーションは数年間使用され、この期間中は多くのコンピューターサイエンスの学生によって維持されます。 私たちの上司は約30年前に卒業しました(犯罪とは見なされません。私もその半分以上を背負っています)。このアプリケーションをANSI Cで開発することを義務付けています。ほぼ全時間であり、したがって、彼は私たちが何をしているかを理解できなければなりません。彼はまた、抽象データ型を使用しないことを決定しました。彼は私たちが使用したいグローバル変数(ため息)の名前のリストさえも私たちに与えました。 私は実際にしばらくこのアプローチを試しましたが、すべてのポインター操作が安全で、すべての文字列が正しいサイズであることを確認するのに本当に時間がかかりました。さらに、実際に手元の問題に関連するコードの行数は、コードベースのほんの一部でした。数日後、私は全体を廃棄し、C#を使用して新たに始めました。私たちの上司はすでにプログラムが実行されていることを見ており、その動作方法は気に入っていますが、別の言語で書かれていることを知りません。 来週、私たち二人はソースコードを調べるために会い、彼は「それを維持する方法を知っている」。私はちょっと怖いです、そして、私は私の決定を支持するためにどんな議論を使用することができるかあなたたちから聞きたいです。 ward病なあなたのもの、

5
インターフェイスを明示的または暗黙的に実装することの違いは何ですか?
Visual Studioでは、インターフェイスを右クリックして、[インターフェイスの実装]または[インターフェイスの明示的な実装]を選択できます。 public class Test : ITest { public string Id // Generated by Implement Interface { get { throw new NotImplementedException(); } } string ITest.Id // Generated by Implement Interface Explicitly { get { throw new NotImplementedException(); } } } この2つの間に見られる唯一の違いは、インターフェイスを明示的に実装することを選択した場合、作成時にインターフェイスのプロパティとメソッドにインターフェイス名が追加されることです。 そのメソッド/プロパティがどこから来たのかを見ることができるので、コードが少し読みやすくなりますが、これはクラスの使用方法やコンパイル方法に違いをもたらしますか?暗黙的または明示的にインターフェイスを実装する場合、それは本当に重要ですか?
64 c#  syntax 

11
大きなブール式は、述語メソッドに分解された同じ式より読みやすいですか?[閉まっている]
理解しやすいもの、大きなブール文(非常に複雑なもの)、または述語メソッドに分解された同じ文(多くの余分なコードを読む) オプション1、大きなブール式: private static bool ContextMatchesProp(CurrentSearchContext context, TValToMatch propVal) { return propVal.PropertyId == context.Definition.Id && !repo.ParentId.HasValue || repo.ParentId == propVal.ParentId && ((propVal.SecondaryFilter.HasValue && context.SecondaryFilter.HasValue && propVal.SecondaryFilter.Value == context.SecondaryFilter) || (!context.SecondaryFilter.HasValue && !propVal.SecondaryFilter.HasValue)); } オプション2、条件を述語メソッドに分割: private static bool ContextMatchesProp(CurrentSearchContext context, TValToMatch propVal) { return MatchesDefinitionId(context, propVal) && MatchesParentId(propVal) && (MatchedSecondaryFilter(context, propVal) …
63 c#  readability 

11
このクラス設計は単一の責任原則に違反していますか?
今日、誰かと議論がありました。 私は貧血領域モデルとは対照的に、豊富な領域モデルを持つことの利点を説明していました。そして、次のような単純なクラスでポイントをデモしました。 public class Employee { public Employee(string firstName, string lastName) { FirstName = firstName; LastName = lastname; } public string FirstName { get private set; } public string LastName { get; private set;} public int CountPaidDaysOffGranted { get; private set;} public void AddPaidDaysOffGranted(int numberOfdays) { // Do stuff } …


6
Javaとは異なり、「new」および「virtual + override」キーワードでC#が作成されたのはなぜですか?
Javaではノーがあるvirtual、new、overrideメソッド定義のキーワード。したがって、メソッドの動作は理解しやすいです。場合原因DerivedClassが延びBaseClassのを、同じ名前と同じシグネチャを持つ方法有するBaseClassのその後ランタイム多形で行われるオーバーライドが(メソッドではない提供しますstatic)。 BaseClass bcdc = new DerivedClass(); bcdc.doSomething() // will invoke DerivedClass's doSomething method. C#に来ると、非常に多くの混乱が発生し、newor virtual+deriveまたはnew + virtualオーバーライドがどのように機能するかを理解するのが難しくなります。 なぜ世界DerivedClassで同じ名前と同じシグネチャを持つメソッドを追加しBaseClass、新しい動作を定義するのかを理解することはできませんが、実行時のポリモーフィズムでは、BaseClassメソッドが呼び出されます!(これはオーバーライドではありませんが、論理的にはそうする必要があります)。 以下の場合にはvirtual + override論理的な実装が正しいですが、プログラマが、彼はコーディングの際に上書きするようにユーザーに権限を与えるべき方法だと思うしなければならないのに。これには賛否両論があります(今は行かないでください)。 それで、なぜC#には非論理的な推論と混乱のためのスペースがあるのか。それで、どの現実世界の文脈で、代わりに使用するか、またvirtual + override代わりに使用することを考えるべきかという質問を再構成できますか?newnewvirtual + override 特にOmarからの非常に良い回答の後に、C#デザイナーはメソッドを作成する前にプログラマが考える必要があることについてより多くのストレスを与えたと思います。 今、私は質問を念頭に置いています。Javaのように、次のようなコードがあった場合 Vehicle vehicle = new Car(); vehicle.accelerate(); 後で新しいクラスをSpaceShip派生させVehicleます。次にcar、すべてをSpaceShipオブジェクトに変更したいので、1行のコードを変更するだけです Vehicle vehicle = new SpaceShip(); vehicle.accelerate(); これは、コードのどのポイントでも私のロジックを壊しません。 しかし、C#の場合、if SpaceShipがVehicleクラスをオーバーライドせずにaccelerate使用するnewと、コードのロジックが壊れます。それは不利ではないですか?

17
巨大な「switch」ステートメントの代わりにオブジェクト指向アプローチを使用するのはなぜですか?
私は.Net、C#ショップで働いており、より多くのオブジェクト指向のアプローチではなく、多くの「ケース」を使用してコードで巨大なSwitchステートメントを使用することを主張し続ける同僚がいます。彼の主張は一貫して、Switchステートメントが「cpuジャンプテーブル」にコンパイルされ、したがって最速のオプションであるという事実に戻っています(他のことでは、速度については気にしないとチームに言われますが)。 正直なところ、これに反対する議論はありません...彼が何について話しているのかわからないからです。 彼は正しいですか? 彼はただお尻を話しているだけですか? ここで学ぼうとしています。

7
C#またはJavaのような言語で代数データ型をどのようにエンコードしますか?
代数データ型で簡単に解決できる問題がいくつかあります。たとえば、リスト型は次のように簡潔に表現できます。 data ConsList a = Empty | ConsCell a (ConsList a) consmap f Empty = Empty consmap f (ConsCell a b) = ConsCell (f a) (consmap f b) l = ConsCell 1 (ConsCell 2 (ConsCell 3 Empty)) consmap (+1) l この特定の例はHaskellにありますが、代数データ型をネイティブにサポートする他の言語でも同様です。 OOスタイルのサブタイプへの明らかなマッピングがあることがわかります。データ型は抽象基本クラスになり、すべてのデータコンストラクターは具体的なサブクラスになります。Scalaの例を次に示します。 sealed abstract class ConsList[+T] { def map[U](f: T …

9
可読性と保守性、ネストされた関数呼び出しを記述する特別な場合
ネストされた関数呼び出しのコーディングスタイルは次のとおりです。 var result_h1 = H1(b1); var result_h2 = H2(b2); var result_g1 = G1(result_h1, result_h2); var result_g2 = G2(c1); var a = F(result_g1, result_g2); 私は最近、次のコーディングスタイルが非常に使用されている部門に変更しました。 var a = F(G1(H1(b1), H2(b2)), G2(c1)); コーディングの私の方法の結果、クラッシュする機能の場合、Visual Studioは対応するダンプを開き、問題が発生した行を示すことができます(特にアクセス違反が心配です)。 最初の方法でプログラムされた同じ問題によるクラッシュの場合、どの関数がクラッシュを引き起こしたかを知ることができないのではないかと心配しています。 一方、1行に追加する処理が多いほど、1ページに表示されるロジックが多くなり、読みやすくなります。 私の恐怖は正しいのですか、それとも一般的には商業環境で好まれる何かが欠けていますか?可読性または保守性? 関連するかどうかはわかりませんが、C ++(STL)/ C#で作業しています。

6
すべての要求に対してHttpClientの新しい単一のインスタンスを作成する必要がありますか?
最近、私はasp.netモンスターからこのブログ投稿に出くわしHttpClientました。以下の方法での使用に関する問題について話します using(var client = new HttpClient()) { } ブログの投稿によると、HttpClientリクエストごとに破棄すると、TCP接続を開いたままにできます。これにより、潜在的にSystem.Net.Sockets.SocketException。 投稿による正しい方法はHttpClient、ソケットの無駄を減らすのに役立つので、単一のインスタンスを作成することです。 投稿から: HttpClientの単一インスタンスを共有する場合、ソケットを再利用することでソケットの無駄を減らすことができます。 namespace ConsoleApplication { public class Program { private static HttpClient Client = new HttpClient(); public static void Main(string[] args) { Console.WriteLine("Starting connections"); for(int i = 0; i<10; i++) { var result = Client.GetAsync("http://aspnetmonsters.com").Result; Console.WriteLine(result.StatusCode); } Console.WriteLine("Connections done"); Console.ReadLine(); …
57 c#  http-request 

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