の強化に必要な機能通話
-
09-06-2019 - |
質問
ている"状況"クラスのクライアントまで、フルのC#のように使用す:
Status MyFunction()
{
if(...) // something bad
return new Status(false, "Something went wrong")
else
return new Status(true, "OK");
}
のアイデアです。すべての呼び出し側のMyFunction すべ チェック、返される状況:
Status myStatus = MyFunction();
if ( ! myStatus.IsOK() )
// handle it, show a message,...
Lazy呼び出し側ができる無視する状態にします。
MyFunction(); // call function and ignore returned Status
または
{
Status myStatus = MyFunction();
} // lose all references to myStatus, without calling IsOK() on it
によって行うことができるこのできないのでしょうか?例えばan exceptionがスローされる
一般:で書くことができC#クラスのいうんてんめんきょしょうにほん してい 電話、一部の機能しているのでしょうか。
のC++版のクラスで記試験一部の民間bool bIsCheckedの デストラクタ -リング一部の鐘の人がチェックしないこのインスタンス.
うと同等のオプションのC#?を読んでどこかが"いのデストラクタにC#クラス"
の処分方法のIDisposableインターフェースとオプションか?
この場合はありませんでポリシーの資源を無料です。また、決定していない 時 GCにより廃棄処分のオブジェクトです。きっく処理できることを確信していまを知ることができた場合、無視される特定のステータスインスタンス?の"使用"というキーワードは、あなたがいない 必要 見を呼び出し側.
解決
もっこっこさん結論かできな効果をしたいとしての戻り値からのメソッドになっています。C#でしかできないものC++用できます。しかし、やや突による同様の効果は次の通りです:
using System;
public class Example
{
public class Toy
{
private bool inCupboard = false;
public void Play() { Console.WriteLine("Playing."); }
public void PutAway() { inCupboard = true; }
public bool IsInCupboard { get { return inCupboard; } }
}
public delegate void ToyUseCallback(Toy toy);
public class Parent
{
public static void RequestToy(ToyUseCallback callback)
{
Toy toy = new Toy();
callback(toy);
if (!toy.IsInCupboard)
{
throw new Exception("You didn't put your toy in the cupboard!");
}
}
}
public class Child
{
public static void Play()
{
Parent.RequestToy(delegate(Toy toy)
{
toy.Play();
// Oops! Forgot to put the toy away!
});
}
}
public static void Main()
{
Child.Play();
Console.ReadLine();
}
}
の非常に簡単な例では、インスタンスを取得します玩具を呼び出します。RequestToy, と広い範囲にわたって、委譲.の代わりに帰国の玩具は、メソッドはただちに電話を代表との玩具は、呼び名を付けなければなPutAway前を返しますが、RequestToy方法の例外をスローします。いない債権としての知恵の使用この技術--その全てのもの"誤り"の例は、例外がほぼ確実に、より良いベット--と思うかつに近いガトリドゥランゴでおすすめのお手元ます。
他のヒント
このお答えできませんのでご質問がれば"何かを作っ内機能(想定外の状況によってすべき例外をスローしない状態を返します。
それぞれの呼び出しに対応する場合の例外では、することが可能になると伝播の場合、呼び出し側が対応します。
にスローされる例外ですがカスタムタイプの場合は適しています。
のための が期待 代替の結果だったかと思い@Jon Limjapた。私は好きのbool型の戻り値の型とprefixingのメソッド名の"う"のラ:
bool TryMyFunction(out Status status)
{
}
また必要とし、ユーザを取得する結果MyFunctionするためには、無効な代わりに利用し、あなたにとってはref変数は、例えば、
void MyFunction(out Status status)
{
}
このようになってい醜いも少ないことを確実なものと変数が渡された機能との結果が必要かを検討することとする。
@イアン
この例外があった場合においてももう少しでも多くされることもありますので、かかる費用を大幅に削減システムリソースは例外です。例外ともいうべき使用 別格 誤差は全くれます。
でもシステム。います。WebRequest例外をスローしますが、返されるレスポンスのHTTPステータスコードエラーコードです。代表的な処理する方法でラップ、try/catchであるといわれている。きを無視し、ステータスコードをキャッチブロックです。
できたてのパラメータの行動< 状態の呼び出し側は強制的にパスコールバック関数を受け入れ状況をチェックさんと呼ばれます。
void MyFunction(Action<Status> callback)
{ bool errorHappened = false;
if (somethingBadHappend) errorHappened = true;
Status status = (errorHappend)
? new Status(false, "Something went wrong")
: new Status(true, "OK");
callback(status)
if (!status.isOkWasCalled)
throw new Exception("Please call IsOK() on Status").
}
MyFunction(status => if (!status.IsOK()) onerror());
っぱいて話IsOK()は何もせずに、表現< Func< 状況bool>>くれるまでを分析し、ラムダが見えない状況:
void MyFunction(Expression<Func<Status,bool>> callback)
{ if (!visitCallbackExpressionTreeAndCheckForIsOKHandlingPattern(callback))
throw new Exception
("Please handle any error statuses in your callback");
bool errorHappened = false;
if (somethingBadHappend) errorHappened = true;
Status status = (errorHappend)
? new Status(false, "Something went wrong")
: new Status(true, "OK");
callback.Compile()(status);
}
MyFunction(status => status.IsOK() ? true : onerror());
は見のクラスは全て峠の一つに委譲のための成功とエラー:
void MyFunction(Action success, Action error)
{ if (somethingBadHappened) error(); else success();
}
MyFunction(()=>;,()=>handleError());
利用状況の戻り値として記憶がよくない"昔"のCプログラミングが返される整数値以下の場合は、0かなかった。
ならば、例外をスローする時(とき) もっ?場合"怠け者コード"が追いつかないので自の例外でしょうか。
代わりの強い状況を確認する、という思いを大切にしていることを想定し、プログラマは、このリスクがないことがその理由を取り入れることにより起こります。んの機能は、将来の使用を制限のようなことのみを制限する可能性が広がる。
いずれもコンパイラのチェックによらないです。:/ いうことになりました。
投げることができる例外:
throw MyException;
[global::System.Serializable]
public class MyException : Exception
{
//
// For guidelines regarding the creation of new exception types, see
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp
// and
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp
//
public MyException () { }
public MyException ( string message ) : base( message ) { }
public MyException ( string message, Exception inner ) : base( message, inner ) { }
protected MyException (
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context )
: base( info, context ) { }
}
上記の例外を完全にカスタマイズを購入できます。
ひとつだと思うのは、こうし、呼び出し側のコードを返し、そのresponsabilityあなただけの提供の手段とインターフェース。また、多くより効率的な利用を返しコードのチェックの状況は次のよtrhowing例外をスローしました。場になっているので、 別格 状況に対して、その是非を捨て...もう失敗した場合を開装置、それを慎重にこだわるのを返します。
@ポールのなにができるのでコンパイル時間 伸C#.
GCCは warn_unused_result
属性に最適でこういうことも得意なんですね。おそらくはMicrosoftコンパイラでコンパイルしています。
一つのパターンを作り上げることがありする場合、オブジェクトをコード問題の請求にのみ使用する単一のスレッド(*)は、オブジェクトに保つエラー状態ったね"と言っていただける場合の操作に失敗したのオブジェクトを利用できなくなるまでのエラー状態をリセット(将来的には、要求を破すぐ、好ましくはを投入することにより即時に例外が含まれる情報は、以前の障害の新しいます。場合に呼び出しのコードが見込みに問題ことを可能にすることができる呼び出しを処理するコードの問題をより綺麗になれば、例外がスローされ;的な問題を無視しないよう、呼び出しのコードは一般的に起動例外から発生します。
(*)が資源アクセス可能である複数スレッドをラッパーオブジェクトの各スレッドは、各スレッドの要求を独自のラッパー.
このパターンが利用できるのもコンテキストの例外を除いない場合が実践しています。一般的に、しかし、数の変動にされていないパターンは、通常ります。い方法exceptionがスローされる失敗しない限り、明示的に呼び出し側を示すことにより、 TryXX
法)による故障を期待しています。場合に呼び出し側も障害されな取り扱いには、その問題です。きを組み合わせてみ/う二層の保護の制度上していると思うかはまだわかりませんが、いずれかの価値、コストの低減ができます。