ভিবি.এনইটি এবং সি # এর কোনও মানের তুলনায় নাল পরীক্ষা করার ক্ষেত্রে কেন পার্থক্য রয়েছে?


110

ইন VB.NET এই ঘটনার:

Dim x As System.Nullable(Of Decimal) = Nothing
Dim y As System.Nullable(Of Decimal) = Nothing

y = 5
If x <> y Then
    Console.WriteLine("true")
Else
    Console.WriteLine("false") '' <-- I got this. Why?
End If

তবে সি # তে এটি ঘটে:

decimal? x = default(decimal?);
decimal? y = default(decimal?);

y = 5;
if (x != y)
{
    Debug.WriteLine("true"); // <-- I got this -- I'm with you, C# :)
}
else
{
    Debug.WriteLine("false");
}

কেন পার্থক্য আছে?


22
এটা ভয়াবহ।
মাইকিব

8
আমি বিশ্বাস করি default(decimal?)0 ফিরে আসছেন, নয় null
রায়ান ফ্রেম

7
নিবন্ধন করুন যেহেতু এটি অযোগ্য প্রকারের , তাই এটি ফিরে আসেnull
Soner Gönül

4
ওহ হ্যাঁ ... ঠিক আছে ... ভিবি Ifশর্তাবলীতে একটি বুলিয়ান হিসাবে মূল্যায়ন করার প্রয়োজন নেই ... উওউগ সম্পাদনা: সুতরাং Nothing <> Anything = Nothingযার ফলস্বরূপ Ifনেতিবাচক / অন্য পথে নেওয়ার ফলস্বরূপ ।
ক্রিস সিনক্লেয়ার

13
@ জেএমকে: নাল, কিছুই এবং খালি আসলে সমস্ত সূক্ষ্মভাবে পৃথক। যদি সেগুলি একই রকম হয় তবে আপনার তিনটির প্রয়োজন হবে না।
এরিক লিপার্ট

উত্তর:


88

ভিবি.এনইটি এবং সি #। নেট বিভিন্ন ভাষা যা বিভিন্ন দল দ্বারা নির্মিত যা ব্যবহার সম্পর্কে বিভিন্ন ধারণা নিয়েছে; এই ক্ষেত্রে একটি NUL তুলনা শব্দার্থক।

আমার ব্যক্তিগত পছন্দটি ভিবি.এনইটি শব্দার্থবিজ্ঞানের পক্ষে, যা মূলত "আমি এখনও জানি না" শব্দার্থবিজ্ঞানগুলিকে দেয় gives তারপরে 5 এর তুলনা "আমি এখনও জানি না"। স্বাভাবিকভাবেই "আমি এখনও জানি না"; অর্থাৎ NULL। এসকিউএল ডাটাবেসে NULL এর আচরণটি মিরর করার অতিরিক্ত সুবিধা রয়েছে। এটিও একটি আরো মান (তুলনায় সি # 'গুলি) তিন মূল্যবান যুক্তি ব্যাখ্যা, যেমন ব্যাখ্যা করেছেন এখানে

সি # টিম NUL এর অর্থ সম্পর্কে বিভিন্ন ধারণা তৈরি করেছিল, ফলে আপনি যে আচরণের পার্থক্য দেখান তার ফলস্বরূপ। এরিক লিপার্ট সি # তে নুলের অর্থ সম্পর্কে একটি ব্লগ লিখেছিলেন । পেরে এরিক লিপার্ট: "আমি এখানে এবং এখানে ভিবি / ভিবিএসক্রিপ্ট এবং জেএসক্রিপ্টে নালগুলির শব্দার্থবিদ্যা সম্পর্কেও লিখেছি "।

যে পরিবেশে ন্যূনুয়াল মানগুলি সম্ভব, এটি স্বীকৃতি দেওয়া সমীচীন যে বাদ দেওয়া মধ্যের আইনটি (যেমন এ বা ~ এ টোটোলজিক্যালি সত্য) এর উপর আর নির্ভর করা যায় না।

হালনাগাদ:

একটি bool(এর বিপরীতে bool?) কেবলমাত্র সত্য এবং মিথ্যা মান নিতে পারে। তবে NULL এর একটি ভাষা বাস্তবায়নের ক্ষেত্রে NUL কীভাবে ভাব প্রকাশের মাধ্যমে প্রচার করে তা নিয়ে সিদ্ধান্ত নিতে হবে। ভিবিতে এক্সপ্রেশন 5=nullএবং 5<>nullউভয় মিথ্যা প্রত্যাবর্তন করে। তুলনামূলক এক্সপ্রেশনগুলির সি # তে 5==nullএবং 5!=nullকেবলমাত্র দ্বিতীয় প্রথম [2014-03-02 আপডেট হয়েছে - পিজি] মিথ্যা প্রত্যাবর্তন করে। যাইহোক, যে কোনও পরিবেশে নালকে সমর্থন করে, সেই প্রোগ্রামার দ্বারা সত্যের টেবিলগুলি এবং সেই ভাষা দ্বারা ব্যবহৃত নাল-প্রচার প্রচার করা দায়বদ্ধ।

হালনাগাদ

শব্দার্থবিজ্ঞানের বিষয়ে এরিক লিপার্টের ব্লগ নিবন্ধগুলি (নীচে তার মন্তব্যে উল্লিখিত) এখন রয়েছে:


4
লিঙ্কের জন্য ধন্যবাদ। আমি এখানে ভিবি / ভিবিএসক্রিপ্ট এবং জেএসক্রিপ্টের নালগুলির শব্দার্থবিজ্ঞানের কথাও লিখেছি: ব্লগস.এমএসএনএন / বি / এরিক্লিপার্ট / আর্কাইভ / ২০০৩ / ০৯ / ৩০ / ৫৩০২০.এএসপিএক্স এবং এখানে: ব্লগস.এমএসএনএন
এরিক লিপার্ট

27
এবং এফওয়াইআই এইভাবে ভিবি'র সাথে সি # বেমানান করার সিদ্ধান্তটি একটি বিতর্কিত ছিল। আমি তখন ভাষা নকশা দলে ছিলাম না তবে এই সিদ্ধান্তে যে পরিমাণ বিতর্ক হয়েছিল তা যথেষ্ট ছিল।
এরিক লিপার্ট

2
@ ব্লুরাজা-ড্যানিপ্লুঘুফুট সি # তে bool3 টি মান থাকতে পারে না, কেবল দুটি। এটির bool?তিনটি মান থাকতে পারে। operator ==এবং operator !=উভয়ই প্রত্যাবর্তন করে boolনা bool?, অপারেণ্ডের ধরণ নির্বিশেষে। অতিরিক্তভাবে, একটি ifবিবৃতি কেবল একটিকেই গ্রহণ করতে পারে , একটি boolনয় bool?
পরিবেশন করুন

1
সি # তে প্রকাশ 5=nullএবং 5<>nullকার্যকর নয়। এবং 5 == nullএবং 5 != null, আপনি কি নিশ্চিত যে এটি দ্বিতীয়টি ফিরে আসে false?
বেন ভয়েগট

1
@ বেনভয়েগ: ধন্যবাদ এই সমস্ত আপ-ভোট এবং আপনি সেই টাইপগুলিকে সর্বাধিক স্পট করেছেন। ;-)
পিটার জেরকেনস

37

কারণ পরিবর্তে x <> yফিরে । সংজ্ঞায়িত না হওয়ায় এটি কেবল সংজ্ঞায়িত হয় না। (এসকিউএল নাল অনুরূপ)।Nothingtruex

নোট: VB.NET Nothing<> C # এর null

আপনার Nullable(Of Decimal)যদি একটি মান হয় তবেই এটির মান তুলনা করতে হবে।

সুতরাং উপরের ভিবি.এনইটি এটির সাথে তুলনা করে (যা কম ভুল বলে মনে হচ্ছে):

If x.HasValue AndAlso y.HasValue AndAlso x <> y Then
    Console.WriteLine("true")
Else
    Console.WriteLine("false")  
End If

VB.NET ভাষার স্পেসিফিকেশন :

.1.১.১ ননযোগ্য মান প্রকারের ... একটি মূল্যহীন মান প্রকারের মধ্যে নাল মান হিসাবে প্রকারের নন-অযোগ্য সংস্করণ হিসাবে একই মান থাকতে পারে। সুতরাং, একটি নলযোগ্য মান ধরণের জন্য, কোনও ধরণের ভেরিয়েবলের জন্য কিছুই নির্ধারণ করা ভেরিয়েবলের মান নাল মানকে নির্ধারণ করে, মান ধরণের শূন্য মান নয়।

উদাহরণ স্বরূপ:

Dim x As Integer = Nothing
Dim y As Integer? = Nothing

Console.WriteLine(x) ' Prints zero '
Console.WriteLine(y) ' Prints nothing (because the value of y is the null value) '

16
"VB.NET কিছুই << C # নাল" এটি সি # এর পক্ষে সত্য এবং VB.Net এর পক্ষে মিথ্যা? স্রেফ মজা করছি :
কেন 2 কে

17

উত্পন্ন সিআইএল দেখুন (আমি উভয়কে সি # তে রূপান্তর করেছি):

সি #:

private static void Main(string[] args)
{
    decimal? x = null;
    decimal? y = null;
    y = 5M;
    decimal? CS$0$0000 = x;
    decimal? CS$0$0001 = y;
    if ((CS$0$0000.GetValueOrDefault() != CS$0$0001.GetValueOrDefault()) ||
        (CS$0$0000.HasValue != CS$0$0001.HasValue))
    {
        Console.WriteLine("true");
    }
    else
    {
        Console.WriteLine("false");
    }
}

ভিজ্যুয়াল বেসিক:

[STAThread]
public static void Main()
{
    decimal? x = null;
    decimal? y = null;
    y = 5M;
    bool? VB$LW$t_struct$S3 = new bool?(decimal.Compare(x.GetValueOrDefault(), y.GetValueOrDefault()) != 0);
    bool? VB$LW$t_struct$S1 = (x.HasValue & y.HasValue) ? VB$LW$t_struct$S3 : null;
    if (VB$LW$t_struct$S1.GetValueOrDefault())
    {
        Console.WriteLine("true");
    }
    else
    {
        Console.WriteLine("false");
    }
}

আপনি দেখতে পাবেন যে ভিজ্যুয়াল বেসিকের তুলনাটি নুলযোগ্য <bool> (বুল, মিথ্যা বা সত্য নয়!) প্রদান করে। এবং বুলে রূপান্তরিত অপরিজ্ঞাত মিথ্যা।

NothingNothingভিজ্যুয়াল বেসিক (এটি এসকিউএল এর মতো একই) এর ক্ষেত্রে সবসময় যা আছে তার তুলনায় ।


কেন পরীক্ষার এবং ত্রুটি করে প্রশ্নের উত্তর দিন? ভাষার স্পেসিফিকেশন থেকে এটি করা সম্ভব হওয়া উচিত।
ডেভিড হেফারনান

3
@ ডেভিডহেফার্নান, কারণ এটি ভাষার পার্থক্য দেখায় যা বেশ স্পষ্ট নয়।
nothrow

2
@ ইওসোরিয়ান আপনারা মনে করেন যে ভাষা চশমাগুলি এই বিষয়ে অস্পষ্ট। আমি একমত নই আইএল একটি পরিবর্তনের সাপেক্ষে একটি বাস্তবায়নের বিশদ; চশমা হয় না।
পরিবেশন করুন

2
@ ডেভিড হেফারনান: আমি আপনার মনোভাব পছন্দ করি এবং আপনাকে চেষ্টা করতে উত্সাহিত করি। ভিবি ভাষার স্পেসিফিকেশন মাঝে মাঝে পার্স করা কঠিন হতে পারে। লুসিয়ান এখন কয়েক বছর ধরে এটির উন্নতি করছে তবে এই ধরণের কোণার মামলার সঠিক অর্থ খুঁজে বের করা এখনও বেশ কঠিন। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি অনুমানের একটি অনুলিপি পান, কিছু গবেষণা করুন এবং আপনার অনুসন্ধানের প্রতিবেদন করুন।
এরিক লিপার্ট

2
আইএল আপনি যে কোডটি প্রদান করেছেন নির্বাহ ফলাফল @Yossarian পরিবর্তন সাপেক্ষে নয়, কিন্তু সি # / ভিবি প্রদান আইএল আপনি যে কোডটি দেখিয়েছেন মধ্যে কম্পাইল করা হবে যে কোডটি হল (যতদিন যে আইএল হয় আচরণ যেমন পরিবর্তন সাপেক্ষে এছাড়াও ভাষার চশমাগুলির সংজ্ঞাটির সাথে ইনলাইন করুন)।
পরিবেশন করুন

6

যে সমস্যাটি এখানে পর্যবেক্ষণ করা হয়েছে তা একটি আরও সাধারণ সমস্যার একটি বিশেষ ক্ষেত্রে, যা হ'ল সাম্যতার বিভিন্ন সংজ্ঞা যা কমপক্ষে কিছু পরিস্থিতিতে কার্যকর হতে পারে তা প্রকাশ করার জন্য সাধারণভাবে উপলব্ধ উপায়ে সংখ্যা ছাড়িয়ে যায়। এই সমস্যাটি কিছু ক্ষেত্রে দুর্ভাগ্যজনক বিশ্বাসের দ্বারা আরও খারাপ হয়েছে যে সমতার পরীক্ষার বিভিন্ন উপায়ে বিভ্রান্তিমূলক বিভিন্ন ফলাফল পাওয়া যায় এবং যখনই সম্ভব হয় তখন বিভিন্ন ধরণের সাম্যের একই ফল পাওয়া যায় বলে এ জাতীয় বিভ্রান্তি এড়ানো যেতে পারে।

বাস্তবে, বিভ্রান্তির মৌলিক কারণটি একটি বিভ্রান্ত বিশ্বাস যা বিভিন্ন ভিন্ন ভিন্ন শব্দার্থবিজ্ঞান বিভিন্ন পরিস্থিতিতে কার্যকর রয়েছে তা সত্ত্বেও সমতা এবং বৈষম্য পরীক্ষার বিভিন্ন ধরণের একই ফলাফল পাওয়া উচিত বলে আশা করা উচিত। উদাহরণস্বরূপ, একটি গাণিতিক দৃষ্টিকোণ থেকে, এটি অনুসরণ করতে সক্ষম হবে Decimalযা কেবল অনুসরণযোগ্য শূন্যের সংখ্যার সাথে সমান হিসাবে তুলনা করে। doubleধনাত্মক শূন্য এবং negativeণাত্মক শূন্যের মতো মানগুলির জন্য একইভাবে । অন্যদিকে, ক্যাচিং বা ইন্টার্নিং দৃষ্টিভঙ্গি থেকে, এই জাতীয় শব্দার্থবিজ্ঞান মারাত্মক হতে পারে। ধরুন, উদাহরণস্বরূপ, এক একটি ছিল Dictionary<Decimal, String>যেমন যে myDict[someDecimal]সমান উচিত someDecimal.ToString()। এইরকম একটি বিষয় যুক্তিসঙ্গত বলে মনে হয় যদি কারও অনেকগুলি থাকেDecimalমানগুলি যেটি স্ট্রিংয়ে রূপান্তর করতে চেয়েছিল এবং অনেকগুলি সদৃশ হওয়ার আশা করেছিল। দুর্ভাগ্যক্রমে, যদি 12.3 মিটার এবং 12.40 মিটার রূপান্তর করতে এই জাতীয় ক্যাচিং ব্যবহার করা হয়, তবে 12.30 মিটার এবং 12.4 মিটার পরে, পরবর্তী মানগুলি "12.3" এবং "12.30" এবং "12.4" এর পরিবর্তে "12.40" উপার্জন করতে পারে।

বিষয়টি হাতে হাতে ফিরে আসার জন্য, সাম্যের জন্য নলযোগ্য বস্তুর তুলনা করার একাধিক বুদ্ধিমান উপায় রয়েছে। সি # এর অবস্থানটি গ্রহণ করে যা এর ==অপারেটরের আচরণের প্রতিবিম্বিত করা উচিত EqualsVB.NET এর অবস্থানটি গ্রহণ করে যে এর আচরণের সাথে অন্য কয়েকটি ভাষার মতো আয়না হওয়া উচিত, যেহেতু যে কেউ Equalsআচরণটি চায় সে ব্যবহার করতে পারে Equals। কিছু দিক থেকে, সঠিক সমাধানটি হ'ল "যদি" নির্মাণ করা হয় ত্রি-উপায়ে থাকা এবং শর্তসাপেক্ষ এক্সপ্রেশন যদি ত্রি-মূল্যযুক্ত ফলাফল ফেরত দেয় তবে কোডটির nullক্ষেত্রে কী ঘটতে হবে তা অবশ্যই নির্দিষ্ট করতে হবে require যেহেতু ভাষা যেমন হয় তেমন কোনও বিকল্প নয়, এর পরের সেরা বিকল্পটি হ'ল বিভিন্ন ভাষা কীভাবে কাজ করে তা শিখতে হবে এবং স্বীকৃতি দিতে পারে যে সেগুলি এক নয়।

ঘটনাক্রমে, ভিজ্যুয়াল বেসিকের "ইস" অপারেটর, যা সি এর অভাবে রয়েছে, এটি কোনও নলযোগ্য বস্তুটি আসলে নাল কিনা তা পরীক্ষা করার জন্য ব্যবহার করা যেতে পারে। যদিও কেউ যুক্তিযুক্তভাবে প্রশ্ন নিতে পারে যে কোনও ifপরীক্ষাটি গ্রহণযোগ্য কিনা Boolean?, সাধারণ তুলনা অপারেটরগুলি ফিরে আসার Boolean?পরিবর্তে Booleanনালাগুলি প্রকারের পরিবর্তে কার্যকর হওয়া বৈশিষ্ট্য। ঘটনাক্রমে, ভিবি.এনইটি-তে, যদি কেউ এর পরিবর্তে সাম্যতা অপারেটরটি ব্যবহার করার চেষ্টা করে Is, একজন সতর্কতা পেয়ে যাবে যে তুলনার ফলাফলটি সর্বদা থাকবে Nothingএবং Isকোনও কিছু শূন্য হলে পরীক্ষা করতে চাইলে একজনকে ব্যবহার করা উচিত ।


C # তে কোনও শ্রেণি নাল কিনা তা পরীক্ষা করেই করা হয় == null। এবং পরীক্ষা করা হচ্ছে একটি নলযোগ্য মান ধরণের একটি মান আছে কিনা তা দ্বারা পরীক্ষা করা .hasValueIs Nothingঅপারেটরের কী ব্যবহার আছে ? সি # এর রয়েছে isতবে এটি ধরণের সামঞ্জস্যের জন্য পরীক্ষা করে। এর আলোকে, আপনার শেষ অনুচ্ছেদটি কী বলতে চাইছে তা আমি সত্যিই নিশ্চিত নই।
এরিক

@ এরিক: ভিবি নেট.এফ এবং সি # উভয়ই তুলনামূলক ব্যবহার করে মূল্যহীন প্রকারের পরীক্ষা করার অনুমতি দেয় null, যদিও উভয় ভাষা HasValueচেকের জন্য সিনট্যাকটিক চিনিরূপ হিসাবে বিবেচনা করে , কমপক্ষে যেখানে প্রকারটি পরিচিত (আমি নিশ্চিত নই জেনেরিকের জন্য কী কোড উত্পন্ন হয়)।
সুপারক্যাট


3

এই পোস্ট হতে পারে আপনি ভাল সাহায্য:

যদি আমি সঠিকভাবে মনে রাখি, ভিবিতে 'কিছুই না' এর অর্থ "ডিফল্ট মান"। একটি মান ধরণের জন্য, এটি একটি ডিফল্ট মান, একটি রেফারেন্স টাইপের জন্য, এটি শূন্য হবে। সুতরাং, কোনও কাঠামোকে কিছুই বরাদ্দ দেওয়া কোনও সমস্যা নয়।


3
এটি প্রশ্নের উত্তর দেয় না।
ডেভিড হেফারনান

না, এটি কিছুই স্পষ্ট করে না প্রশ্নটি <>ভিবি- র অপারেটর সম্পর্কে এবং এটি কীভাবে প্রবণতাজনকভাবে পরিচালিত হয় সে সম্পর্কে is
ডেভিড হেফারনান

2

এটি ভিবির একটি নির্দিষ্ট অদ্ভুততা।

ভিবিতে, আপনি যদি দুটি অপ্রয়োজনীয় প্রকারের তুলনা করতে চান তবে আপনার ব্যবহার করা উচিত Nullable.Equals()

আপনার উদাহরণে এটি হওয়া উচিত:

Dim x As System.Nullable(Of Decimal) = Nothing
Dim y As System.Nullable(Of Decimal) = Nothing

y = 5
If Not Nullable.Equals(x, y) Then
    Console.WriteLine("true")
Else
    Console.WriteLine("false")
End If

5
এটি "অদ্ভুততা" যখন এটি পরিচিত না হয়। পিটার গেরকেন্সের দেওয়া উত্তর দেখুন।
rskar

আচ্ছা আমি এটিকেও আশ্চর্য মনে করি যে ভিবি আচরণের পুনরুত্পাদন করে না Nullable<>.Equals()। কেউ আশা করতে পারে এটি একইভাবে কাজ করবে (এটি সি # যা করে)।
ম্যাথু ওয়াটসন

প্রত্যাশাগুলি যেমন "কেউ আশা করতে পারে" যেমনটি অভিজ্ঞতা অর্জন করে are সি # জাভা ব্যবহারকারীদের প্রত্যাশা মাথায় রেখে ডিজাইন করা হয়েছিল। জাভা সি / সি ++ ব্যবহারকারীদের প্রত্যাশা নিয়ে ডিজাইন করা হয়েছিল। আরও ভাল বা খারাপের জন্য, ভিবি.এনইটি ভিবি 6 ব্যবহারকারীদের প্রত্যাশা মাথায় রেখে তৈরি করা হয়েছিল। এ চিন্তার জন্য আরো খাদ্য stackoverflow.com/questions/14837209/... এবং stackoverflow.com/questions/10176737/...
rskar

1
@ ম্যাথো ওয়াটসন .NET- Nullableর প্রথম সংস্করণে এর সংজ্ঞাটি ছিল না, এটি সি # এবং ভিবি.এনইটি কিছু সময়ের জন্য বেরিয়ে আসার পরে তৈরি হয়েছিল এবং ইতিমধ্যে তাদের নাল প্রচারের আচরণ নির্ধারণ করেছিল। আপনি কি সত্যই আশা করেন যে ভাষাটি এমন এক ধরণের সাথে সামঞ্জস্য রয়েছে যা বেশ কয়েক বছর ধরে তৈরি হয়নি? কোনও ভিবি.এনইটি প্রোগ্রামারের দৃষ্টিকোণ থেকে, এটি নালামযোগ্য qu এখুয়ালগুলি যা অন্যান্য ভাষার চেয়ে বরং ভাষার সাথে সামঞ্জস্যপূর্ণ নয়। (সি # এবং ভিবি উভয় একই Nullableসংজ্ঞা ব্যবহার করে , এটি উভয় ভাষার সাথে সামঞ্জস্য রাখার কোনও উপায় ছিল না।)
সার্ভি

0

আপনার ভিবি কোডটি সহজভাবে ভুল - আপনি যদি "x <> y" কে "x = y" তে পরিবর্তন করেন তবে ফলস্বরূপ আপনার এখনও "মিথ্যা" থাকবে। অযোগ্য উদাহরণগুলির জন্য এটি প্রকাশের সর্বাধিক সাধারণ উপায় হ'ল "নয় x.Equals (y)", এবং এটি সি # তে "x! = Y" এর মতো আচরণ করবে।


1
যদি না xহয় nothing, যে ক্ষেত্রে x.Equals(y)একটি ব্যতিক্রম নিক্ষেপ করা হবে।
21

@ সার্ভে: এ নিয়ে আবার হোঁচট খেয়েছে (বহু বছর পরে), এবং লক্ষ্য করেছে যে আমি আপনাকে সংশোধন করি নি - "x.Equals (y)" nallable type 'x' এর জন্য একটি ব্যতিক্রম বোধ করবে না । সংক্ষিপ্ত প্রকারগুলি সংকলক দ্বারা পৃথকভাবে চিকিত্সা করা হয়।
ডেভ ডোকনজাস

বিশেষত, 'নাল' দিয়ে আরম্ভ করা একটি অযোগ্য উদাহরণ আসলে নালায় পরিবর্তিত একটি সেট নয়, তবে একটি সিস্টেম.নুল্যযোগ্য উদাহরণ নেই যার কোনও মান সেট নেই।
ডেভ ডোকনজাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.