নিম্নলিখিত কোডের উদাহরণগুলি আমার প্রশ্নের প্রসঙ্গ সরবরাহ করে।
রুম বর্গটি একটি প্রতিনিধি দিয়ে শুরু করা হয়। রুম বর্গের প্রথম প্রয়োগে, প্রতিনিধিদের বিরুদ্ধে কোনও প্রহরী নেই যা ব্যতিক্রম ছুঁড়ে ফেলে। এই ধরনের ব্যতিক্রমগুলি উত্তর সম্পত্তিতে বুদবুদ হবে, যেখানে প্রতিনিধিকে মূল্যায়ন করা হয় (দ্রষ্টব্য: মূল () পদ্ধতিটি দেখায় যে কীভাবে কোনও ক্লাস কোডে রুমের উদাহরণ ব্যবহার করা হয়):
public sealed class Room
{
private readonly Func<Room> north;
public Room(Func<Room> north)
{
this.north = north;
}
public Room North
{
get
{
return this.north();
}
}
public static void Main(string[] args)
{
Func<Room> evilDelegate = () => { throw new Exception(); };
var kitchen = new Room(north: evilDelegate);
var room = kitchen.North; //<----this will throw
}
}
উত্তর সম্পত্তিটি পড়ার পরিবর্তে আমি বস্তু তৈরিতে ব্যর্থ হয়েছি বলে আমি কন্সট্রাক্টরকে ব্যক্তিগত হিসাবে পরিবর্তন করি এবং তৈরি () নামে একটি স্থিতিশীল কারখানার পদ্ধতি প্রবর্তন করি। এই পদ্ধতিটি প্রতিনিধি দ্বারা নিক্ষিপ্ত ব্যতিক্রমটিকে ধরে এবং একটি অর্থবহ ব্যতিক্রম বার্তা সহ একটি মোড়কের ব্যতিক্রম ছুঁড়ে ফেলে:
public sealed class Room
{
private readonly Func<Room> north;
private Room(Func<Room> north)
{
this.north = north;
}
public Room North
{
get
{
return this.north();
}
}
public static Room Create(Func<Room> north)
{
try
{
north?.Invoke();
}
catch (Exception e)
{
throw new Exception(
message: "Initialized with an evil delegate!", innerException: e);
}
return new Room(north);
}
public static void Main(string[] args)
{
Func<Room> evilDelegate = () => { throw new Exception(); };
var kitchen = Room.Create(north: evilDelegate); //<----this will throw
var room = kitchen.North;
}
}
ট্রাই-ক্যাচ ব্লক কি তৈরি () পদ্ধতিটিকে অপরিশোধিত করে?
Create
হয় তবে এটি একে কল করে।
Create
সম্পত্তি পাওয়ার সময় আপনার ফাংশন আপনাকে কোনও ব্যতিক্রম থেকে রক্ষা করে না। যদি আপনার প্রতিনিধি ছুড়ে ফেলে তবে বাস্তব জীবনে খুব সম্ভবত এটি কেবল কিছু শর্তের মধ্যে ফেলে দেওয়া হবে। সম্ভাবনা হ'ল নিক্ষেপ করার শর্তগুলি নির্মাণের সময় উপস্থিত হয় না তবে সম্পত্তি পাওয়ার সময় তারা উপস্থিত থাকে।