যদি একটি বিবৃতিতে অ্যাসাইনমেন্ট


142

আমার একটি ক্লাস আছে Animal, এবং এর সাবক্লাস রয়েছে Dog। আমি প্রায়শই নিজেকে নীচের লাইনগুলি কোড করে দেখি:

if (animal is Dog)
{
    Dog dog = animal as Dog;    
    dog.Name;    
    ... 
}

পরিবর্তনশীল জন্য Animal animal;

এমন কিছু বাক্য গঠন রয়েছে যা আমাকে এমন কিছু লেখার অনুমতি দেয়:

if (Dog dog = animal as Dog)
{    
    dog.Name;    
    ... 
}

1
এর অর্থ কী? কী boolঅবস্থা হবে?
কર્ક ভোল

আমি যে কিছুই জানি না। নামটিকে পশুর উপরে না নিয়ে যাওয়ার কোনও কারণ?
অ্যালজি

22
কেবল একটি নোট, কোড জাতীয় কোডগুলি প্রায়শই সোলিড নীতিগুলির একটি ভেঙে ফেলার ফলস্বরূপ হতে পারে । এল - Liskov উপকল্পন পুঁজি । আপনি যেটা সারাক্ষণ করে যাচ্ছেন তা করা ভুল নয়, তবে এটি ভেবে দেখার মতো হতে পারে।
ckittel

@ কিত্তেল কী করছে তা দয়া করে নোট করুন, আপনি সম্ভবত এটি করতে চান না
খেব্বি

1
@ সলো নং null,! = falseসি তে; সি # কেবলমাত্র প্রকৃত বুল বা জিনিসগুলিকে ifশর্তে স্পষ্টভাবে রূপান্তরিত করতে দেয় । নালগুলি বা কোনও পূর্ণসংখ্যার ধরণের কোনওই স্পষ্টতই বুলগুলিতে রূপান্তরিত হয়।
রোমান স্টারকভ

উত্তর:


323

নীচের উত্তরটি কয়েক বছর আগে লেখা হয়েছিল এবং সময়ের সাথে সাথে আপডেট হয়েছিল। সি # 7 হিসাবে, আপনি প্যাটার্ন মিলটি ব্যবহার করতে পারেন:

if (animal is Dog dog)
{
    // Use dog here
}

দ্রষ্টব্য যে বিবৃতিটির dogপরেও সুযোগ রয়েছে if, তবে অবশ্যই নির্ধারিত নয়।


না, নেই। এটি লিখতে আরও বুদ্ধিমানের বিষয় যদিও:

Dog dog = animal as Dog;
if (dog != null)
{
    // Use dog
}

প্রদত্ত যে "যদি অনুসরণ করা হয়" প্রায় সর্বদা এভাবে ব্যবহার করা হয়, তবে সেখানে অপারেটর থাকার জন্য এটি আরও বোধ করতে পারে যা উভয় অংশ একসাথে সম্পাদন করে। এটি বর্তমানে সি # 6 এ নেই তবে প্যাটার্ন মিলের প্রস্তাবটি বাস্তবায়িত হলে এটি সি # 7 এর অংশ হতে পারে ।

সমস্যাটি হ'ল আপনি কোনও বিবৃতি 1 এর শর্তের অংশে পরিবর্তনশীল ঘোষণা করতে পারবেন না । আমি যে নিকটতম পদ্ধতির কথা ভাবতে পারি তা হ'ল:if

// EVIL EVIL EVIL. DO NOT USE.
for (Dog dog = animal as Dog; dog != null; dog = null)
{
    ...
}

এটি ঠিক বাজে ... (আমি এটি চেষ্টা করেছি, এবং এটি কাজ করে But তবে দয়া করে, দয়া করে এটি করবেন না Oh ওহ, এবং আপনি অবশ্যই এটি dogব্যবহার করে ঘোষণা করতে পারেন var))

অবশ্যই আপনি একটি এক্সটেনশন পদ্ধতি লিখতে পারেন:

public static void AsIf<T>(this object value, Action<T> action) where T : class
{
    T t = value as T;
    if (t != null)
    {
        action(t);
    }
}

তারপরে এটিকে কল করুন:

animal.AsIf<Dog>(dog => {
    // Use dog in here
});

বিকল্পভাবে, আপনি দুটি একত্রিত করতে পারেন:

public static void AsIf<T>(this object value, Action<T> action) where T : class
{
    // EVIL EVIL EVIL
    for (var t = value as T; t != null; t = null)
    {
        action(t);
    }
}

ল্যাম্পের চেয়ে ক্লিনার উপায়ে ল্যাম্বডা এক্সপ্রেশন ছাড়াই আপনি একটি এক্সটেনশন পদ্ধতিও ব্যবহার করতে পারেন:

public static IEnumerable<T> AsOrEmpty(this object value)
{
    T t = value as T;
    if (t != null)
    {
        yield return t;
    }
}

তারপর:

foreach (Dog dog in animal.AsOrEmpty<Dog>())
{
    // use dog
}

1 আপনি বিবৃতিতে মান নির্ধারণ করতে পারেন if, যদিও আমি খুব কমই এটি করি। এটি যদিও ভেরিয়েবল ঘোষণার মতো নয়। যদিও ডেটা স্ট্রিমগুলি পড়ার সময় এটি করা আমার পক্ষে মারাত্মক অস্বাভাবিক নয় while। উদাহরণ স্বরূপ:

string line;
while ((line = reader.ReadLine()) != null)
{
    ...
}

এই দিনগুলিতে আমি সাধারণত একটি মোড়ক ব্যবহার করতে পছন্দ করি যা আমাকে ব্যবহার করতে দেয় foreach (string line in ...)তবে আমি উপরেরটিকে একটি সুন্দর প্রতিচ্ছবি হিসাবে দেখি। এটা সাধারণত চমৎকার একটি শর্ত মধ্যে পার্শ্ব প্রতিক্রিয়া আছে না, কিন্তু বিকল্প সাধারণত কোড অনুলিপি জড়িত, এবং যখন আপনি এই প্যাটার্ন জানেন এটা অধিকার পেতে সহজ।


76
উত্তর দেওয়ার জন্য +1 এবং এটিও অনুরোধ করে যে ওপি এটি ব্যবহার করে না। তাত্ক্ষণিক ক্লাসিক।
ckittel

8
@ পল: আমি যদি এটি কারও কাছে বিক্রি করার চেষ্টা করতাম, তবে আমি তাদের দৃ strongly়ভাবে এটি ব্যবহার না করার পরামর্শ দেব না। আমি কেবল যা সম্ভব তা দেখিয়ে দিচ্ছি ।
জন স্কিটে

12
@ পল: আমি মনে করি এটি পিছনে অনুপ্রেরণা হতে পারে EVIL EVIL EVILতবে আমি ইতিবাচক নই।
অ্যাডাম রবিনসন

18
আমি কিছুক্ষণ আগে একই ধরণের এক্সটেনশন পদ্ধতি তৈরি করেছি (ওভারলোডগুলির একটি গুচ্ছ সহ) এবং আমি তাদের কল করেছি AsEither(...), আমি মনে করি এটি এর চেয়ে কিছুটা পরিষ্কার AsIf(...), তাই আমি লিখতে পারি myAnimal.AsEither(dog => dog.Woof(), cat => cat.Meeow(), unicorn => unicorn.ShitRainbows())
herzmeister

97
এটি আমি # কিছু সময়ের মধ্যে দেখেছি সি # এর সেরা আপত্তি। স্পষ্টতই আপনি একজন দুষ্ট বুদ্ধিমান।
এরিক লিপার্ট

48

যদি asব্যর্থ হলে, এটি ফেরৎ null

Dog dog = animal as Dog;

if (dog != null)
{
    // do stuff
}

প্রথম, আপনাকে ধন্যবাদ। দ্বিতীয়ত, আমি ifকপিরাইটের বহিঃস্থে নয় , বিবৃতিতে স্কোয়ারটি পরিবর্তন করতে চাই ।
মাইকেল 25 ই

@ মিশেল আপনি যদি কোনও বিবৃতিতে তা করতে পারেন না। যদি একটি বুল ফলাফল থাকতে হয় তবে একটি অ্যাসাইনমেন্ট নয়। জন স্কিটি কিছু ভাল জেনেরিক এবং ল্যাম্বদা সংমিশ্রণ সরবরাহ করে যা আপনিও বিবেচনা করতে পারেন।
রডনি এস ফোলে

ifএকটি বুল ফলাফল এবং একটি অ্যাসাইনমেন্ট থাকতে পারে। Dog dog; if ((dog = animal as Dog) != null) { // Use Dog }কিন্তু এটি এখনও বহিরাগত সুযোগে পরিবর্তনশীল পরিচয় করিয়ে দেয়।
টম মেফিল্ড

12

আপনি ভেরিয়েবলের মান নির্ধারণ করতে পারবেন , যতক্ষণ না ভেরিয়েবলটি বিদ্যমান থাকে। সেই সমস্যাটি যদি সেই পরিবর্তনশীল নামটিকে একই পদ্ধতিতে পরে ব্যবহার করতে দেওয়া হয় তবে আপনি যদি ভেরিয়েবলটিকেও সুযোগ দিতে পারেন।

public void Test()
{
    var animals = new Animal[] { new Dog(), new Duck() };

    foreach (var animal in animals)
    {
        {   // <-- scopes the existence of critter to this block
            Dog critter;
            if (null != (critter = animal as Dog))
            {
                critter.Name = "Scopey";
                // ...
            }
        }

        {
            Duck critter;
            if (null != (critter = animal as Duck))
            {
                critter.Fly();
                // ...
            }
        }
    }
}

অভিমানী

public class Animal
{
}

public class Dog : Animal
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            Console.WriteLine("Name is now " + _name);
        }
    }
}

public class Duck : Animal
{
    public void Fly()
    {
        Console.WriteLine("Flying");
    }
}

আউটপুট পায়:

Name is now Scopey
Flying

স্ট্রিমগুলি থেকে বাইট ব্লকগুলি পড়ার সময় পরীক্ষায় পরিবর্তনশীল অ্যাসাইনমেন্টের ধরণটিও ব্যবহৃত হয়, উদাহরণস্বরূপ:

int bytesRead = 0;
while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0) 
{
    // ...
}

উপরে পরিবর্তিত স্কোপিংয়ের প্যাটার্নটি ব্যবহৃত হয়, তবে এটি কোনও সাধারণ কোড প্যাটার্ন নয় এবং যদি আমি দেখেছিলাম যে এটি পুরো জায়গাতে ব্যবহার করা হচ্ছে তবে আমি এটির পুনরুদ্ধার করার উপায় খুঁজছি।


11

এমন কিছু বাক্য গঠন রয়েছে যা আমাকে এমন কিছু লেখার অনুমতি দেয়:

if (Dog dog = animal as Dog) { ... dog ... }

?

সম্ভবত সি # 6.0 এ থাকবে। এই বৈশিষ্ট্যটিকে "ডিক্লেয়ারেশন এক্সপ্রেশন" বলা হয়। দেখা

https://roslyn.codeplex.com/discussions/565640

বিস্তারিত জানার জন্য.

প্রস্তাবিত বাক্য গঠনটি হ'ল:

if ((var i = o as int?) != null) {  i  }
else if ((var s = o as string) != null) {  s  }
else if ...

আরও সাধারণভাবে, প্রস্তাবিত বৈশিষ্ট্যটি হ'ল স্থানীয় ভেরিয়েবল ঘোষণাকে এক্সপ্রেশন হিসাবে ব্যবহার করা যেতে পারে । এই ifবাক্য গঠনটি আরও সাধারণ বৈশিষ্ট্যের এক দুর্দান্ত পরিণতি।


1
এক নজরে এটি কম পঠনযোগ্য বলে মনে হচ্ছে তবে কেবল আজকের মতো আপনার চলকটি ঘোষণা করে। আপনি কি জানবেন যে এই বিশেষ বৈশিষ্ট্যটি -100 পয়েন্ট বারটি কেন পেরেছে?
asawyer

3
@ সাওয়ের: প্রথমত, এটি খুব ঘন ঘন অনুরোধ করা বৈশিষ্ট্য। দ্বিতীয়ত, অন্যান্য ভাষার এই এক্সটেনশনটি "যদি" হয়; উদাহরণস্বরূপ জিসিসি সি ++ এর সমতুল্যকে অনুমতি দেয়। তৃতীয়ত, বৈশিষ্ট্যটি "if" এর চেয়ে বেশি সাধারণ, যেমনটি আমি উল্লেখ করেছি। চতুর্থত, সি # ৩.০ এর পর থেকে সি # তে একটি প্রবণতা রয়েছে যাতে আরও এবং আরও বেশি কিছু তৈরি করা যায় যার জন্য একটি বিবৃতি প্রসঙ্গের পরিবর্তে একটি এক্সপ্রেশন প্রসঙ্গ প্রয়োজন; এটি কার্যকরী-স্টাইল প্রোগ্রামিংয়ে সহায়তা করে। আরও তথ্যের জন্য ভাষা নকশার নোটগুলি দেখুন।
এরিক লিপার্ট

2
@ সাওয়ের: আপনাকে স্বাগতম! আপনার আরও মন্তব্য থাকলে নিখরচায় Roslyn.codeplex.com এ অংশ নিতে পারেন। এছাড়াও, আমি যোগ করব: পঞ্চম, নতুন রোজলিন অবকাঠামো এই ধরণের ক্ষুদ্র পরীক্ষামূলক বৈশিষ্ট্যগুলি বাস্তবায়নের দলকে প্রান্তিক ব্যয় হ্রাস করে, যার অর্থ "বিয়োগ 100" পয়েন্টের মাত্রা হ্রাস পেয়েছে। দলটি নিখুঁতভাবে শালীন ছোট বৈশিষ্ট্যগুলি অন্বেষণ করার জন্য এই সুযোগটি নিচ্ছে যা দীর্ঘ-অনুরোধ করা হয়েছে তবে এর আগে -100 বিন্দু বাধার উপরে এটি কখনও তৈরি করেনি।
এরিক লিপার্ট

1
আমরা যে "পয়েন্টগুলি" সম্পর্কে বলছি তাদের সম্পর্কে এই মন্তব্যের পাঠকরা এই বিষয়ে প্রাক্তন সি # ডিজাইনার এরিক গোনারসনের ব্লগ পোস্টটি পড়তে হবে: ব্লগস.এমএসএনএন / বি / এরিকগু / অর্চিভ / 2004 / 01 / 12 / 57985। aspx । এটি একটি উপমা; কোনও প্রকৃত "পয়েন্ট" গণনা করা হচ্ছে না।
এরিক লিপার্ট

@ এসোয়ার: আমি মনে করি এই বৈশিষ্ট্যটি কলগুলিতে সত্যই জ্বলজ্বল করেছে Try*(যেমন, TryParse) এই বৈশিষ্ট্যটি কেবল এই জাতীয় কলগুলিকে কেবল একটি একক অভিব্যক্তিতে পরিণত করে না (যেমন এটি হওয়া উচিত, আইএমও) নয়, তবে এই ধরণের ভেরিয়েবলগুলি পরিষ্কার করার সুযোগ দেয়। outকোনও Tryপদ্ধতির পরামিতিটি শর্তসাপেক্ষে রেখে দিতে আমি উত্সাহী ; এটি নির্দিষ্ট ধরণের বাগগুলি প্রবর্তন করা আরও শক্ত করে তোলে।
ব্রায়ান

9

আমি নিজেকে লিখতে এবং প্রায়শই ব্যবহার করে দেখতে পাই এমন একটি বর্ধিতকরণের পদ্ধতি হ'ল

public static TResult IfNotNull<T,TResult>(this T obj, Func<T,TResult> func)
{
    if(obj != null)
    {
        return func(obj);
    }
    return default(TResult);
}

যা এই পরিস্থিতিতে হিসাবে ব্যবহার করা যেতে পারে

string name = (animal as Dog).IfNotNull(x => x.Name);

এবং তারপরে nameকুকুরটির নাম (যদি এটি কুকুর হয়), অন্যথায় শূন্য।

* এটি পারফর্মেন্ট হলে আমার কোনও ধারণা নেই। এটি প্রোফাইলিংয়ে কখনও বাধা হিসাবে আসে নি।


2
নোটের জন্য +1 যদি এটি প্রোফাইলিংয়ে কখনও বাধা হিসাবে না আসে তবে এটি যথেষ্ট পারফরম্যান্সের একটি দুর্দান্ত লক্ষণ ।
কোডি গ্রে

আপনি কেন ডিফল্ট ওয়ালিউকে একটি আর্গুমেন্ট হিসাবে গ্রহণ করবেন এবং ফোনকারীকে ডিফল্টে ফিরে যাওয়ার পরিবর্তে আমি কী বলছি তা সিদ্ধান্ত নিতে দেবেন (....)?
ত্রিশূল

5

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

বিকল্পভাবে, পদ্ধতিটি উল্টান যাতে আপনি প্রাণীর উপর এমন কোনও পদ্ধতি কল করেন যা প্রাণীর কংক্রিটের উপর নির্ভর করে কিছু ভিন্নভাবে কাজ করে। আরও দেখুন: পলিমারফিজম।


4

সংক্ষিপ্ত বিবৃতি

var dog = animal as Dog
if(dog != null) dog.Name ...;

3

বেস ক্লাসটি সংশোধন করার উপর নির্ভর করে এখানে কিছু অতিরিক্ত নোংরা কোড রয়েছে (যদিও জোনসের মতো নোংরা নয়)। আমি মনে করি এটি সম্ভবত উদ্দেশ্যটি হারিয়ে যাওয়ার সময় উদ্দেশ্যটি ক্যাপচার করেছে:

class Animal
{
    public Animal() { Name = "animal";  }
    public List<Animal> IfIs<T>()
    {
        if(this is T)
            return new List<Animal>{this};
        else
            return new List<Animal>();
    }
    public string Name;
}

class Dog : Animal
{
    public Dog() { Name = "dog";  }
    public string Bark { get { return "ruff"; } }
}


class Program
{
    static void Main(string[] args)
    {
        var animal = new Animal();

        foreach(Dog dog in animal.IfIs<Dog>())
        {
            Console.WriteLine(dog.Name);
            Console.WriteLine(dog.Bark);
        }
        Console.ReadLine();
    }
}


3

সমস্যাটি (সিনট্যাক্স সহ) অ্যাসাইনমেন্টের সাথে নয় , কারণ সি # তে অ্যাসাইনমেন্ট অপারেটর একটি বৈধ এক্সপ্রেশন। বরং এটি পছন্দসই ঘোষণার সাথে যেমন ঘোষণাগুলি বিবৃতি হয়।

যদি আমাকে অবশ্যই কোডটি লিখতে হয় তবে আমি মাঝে মাঝে (বৃহত্তর প্রেক্ষাপটে নির্ভর করে) কোডটি এইভাবে লিখব:

Dog dog;
if ((dog = animal as Dog) != null) {
    // use dog
}

উপরের সিনট্যাক্সের সাথে যোগ্যতা রয়েছে (যা অনুরোধ সিনট্যাক্সের কাছাকাছি) কারণ:

  1. এর dog বাইরে ব্যবহার করার ifফলে সংকলনের ত্রুটি ঘটবে কারণ এটি অন্য কোথাও কোনও মান নির্ধারিত হয়নি। (এটি অন্য কোথাও অর্পণ করবেন নাdog ))
  2. এই পদ্ধতিরও এটিকে সুন্দরভাবে প্রসারিত করা যেতে পারে if/else if/...( asউপযুক্ত শাখা নির্বাচন করার জন্য যতগুলি প্রয়োজন কেবল সেখানে রয়েছে ; এটি আমার বড় আকারের যেখানে আমি এই ফর্মটিতে এটি লিখতে হবে যখন অবশ্যই আবশ্যক))
  3. এর সদৃশ এড়ানো is/as। (তবে Dog dog = ...ফর্ম দিয়ে সম্পন্ন ।)
  4. "আইডোমেটিক থাকাকালীন" এর চেয়ে আলাদা নয়। (কেবল দূরে সরে যাবেন না: শর্তসাপেক্ষে একটি সামঞ্জস্যপূর্ণ ফর্ম এবং সহজ রাখুন))

সত্যই dogবিশ্বব্যাপী আলাদা করতে একটি নতুন ব্লক ব্যবহার করা যেতে পারে:

{
  Dog dog = ...; // or assign in `if` as per above
}
Bite(dog); // oops! can't access dog from above

শুভ কোডিং।


আপনি যে পয়েন্টটি অফার করছেন # 1 সেটি আমার মনে প্রথম আসে। ভেরিয়েবলটি ঘোষণা করুন তবে কেবলমাত্র if এ নিয়োগ করুন। পরিবর্তনশীলটি তখন সংকলক ত্রুটি ছাড়া যদি বাইরে থেকে উল্লেখ করা যায় না - নিখুঁত!
ইয়ান ইয়েটস

1

আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন

// ভেরিয়েবল বুল টেম্পার = মিথ্যা ঘোষণা করুন;

 if (previousRows.Count > 0 || (temp= GetAnyThing()))
                                    {
                                    }

0

এক্সটেনশন পদ্ধতিগুলির সাথে অন্য একটি ইভিএল সমাধান :)

public class Tester
{
    public static void Test()
    {
        Animal a = new Animal();

        //nothing is printed
        foreach (Dog d in a.Each<Dog>())
        {
            Console.WriteLine(d.Name);
        }

        Dog dd = new Dog();

        //dog ID is printed
        foreach (Dog dog in dd.Each<Dog>())
        {
            Console.WriteLine(dog.ID);
        }
    }
}

public class Animal
{
    public Animal()
    {
        Console.WriteLine("Animal constructued:" + this.ID);
    }

    private string _id { get; set; }

    public string ID { get { return _id ?? (_id = Guid.NewGuid().ToString());} }

    public bool IsAlive { get; set; }
}

public class Dog : Animal 
{
    public Dog() : base() { }

    public string Name { get; set; }
}

public static class ObjectExtensions
{
    public static IEnumerable<T> Each<T>(this object Source)
        where T : class
    {
        T t = Source as T;

        if (t == null)
            yield break;

        yield return t;
    }
}

আমি ব্যক্তিগতভাবে পরিষ্কার উপায় পছন্দ করি:

Dog dog = animal as Dog;

if (dog != null)
{
    // do stuff
}

0

যদি একটি বিবৃতি এটি অনুমতি দেয় না, তবে লুপের জন্য একটি করবে।

যেমন

for (Dog dog = animal as Dog; dog != null; dog = null)
{
    dog.Name;    
    ... 
}

যদি এটি কাজ করার উপায়টি তাত্ক্ষণিকভাবে সুস্পষ্ট না হয় তবে প্রক্রিয়াটির ধাপে ধাপে ব্যাখ্যাটি এখানে রয়েছে:

  • ভেরিয়েবল কুকুরটি টাইপ কুকুর হিসাবে তৈরি করা হয় এবং ভেরিয়েবল পশুর জন্য নির্ধারিত হয় যা কুকুরের কাছে ফেলে দেওয়া হয়।
  • যদি অ্যাসাইনমেন্টটি ব্যর্থ হয় তবে কুকুরটি বাতিল হয়, যা লুপের বিষয়বস্তুগুলি চালানো থেকে বাধা দেয়, কারণ এটি অবিলম্বে ভেঙে যায়।
  • যদি অ্যাসাইনমেন্টটি সফল হয় তবে ফর লুপটি
    পুনরাবৃত্তির মাধ্যমে চলে ।
  • পুনরাবৃত্তির শেষে, কুকুরের ভেরিয়েবলকে নাল মান দেওয়া হয়, যা লুপের জন্য ভেঙে যায়।


0

আইডিকে যদি এটি কাউকে সহায়তা করে তবে আপনি আপনার ভেরিয়েবলটি নির্ধারণের জন্য সর্বদা ট্রাই পার্স ব্যবহার করার চেষ্টা করতে পারেন। এখানে একটি উদাহরণ:

if (int.TryParse(Add(Value1, Value2).ToString(), out total))
        {
            Console.WriteLine("I was able to parse your value to: " + total);
        } else
        {
            Console.WriteLine("Couldn't Parse Value");
        }


        Console.ReadLine();
    }

    static int Add(int value1, int value2)
    {
        return value1 + value2;
    }

মোট পরিবর্তনশীল আপনার যদি বিবৃতি আগে ঘোষণা করা হবে।


0

কোডের একটি লাইন তৈরি করার জন্য আমি কেবলমাত্র আইএফ স্টেটমেন্টটি ইনডিল করেছি যা দেখে আপনি কী আগ্রহী তা দেখায় এটি কিছু কোডকে সংকুচিত করতে সহায়তা করে এবং আমি খুঁজে পেয়েছি এটি বিশেষভাবে অ্যাসাইনমেন্ট নেস্ট করার সময়:

var dog = animal as Dog; if (dog != null)
{
    Console.WriteLine("Parent Dog Name = " + dog.name);

    var purebred = dog.Puppy as Purebred; if (purebred != null)
    {
         Console.WriteLine("Purebred Puppy Name = " + purebred.Name);
    }

    var mutt = dog.Puppy as Mongrel; if (mutt != null)
    {
         Console.WriteLine("Mongrel Puppy Name = " + mutt.Name);
    }
 }

0

আমি জানি আমি পার্টিতে দেরি করে ফেলেছি, তবে আমি বুঝতে পেরেছিলাম যে আমি আমার নিজের কর্মক্ষেত্রটি এই দ্বিধায় পোস্ট করতে পারি যেহেতু আমি এটি এখানে এখনও দেখিনি (বা এই বিষয়ে কোথাও)।

/// <summary>
/// IAble exists solely to give ALL other Interfaces that inherit IAble the TryAs() extension method
/// </summary>
public interface IAble { }

public static class IAbleExtension
{
    /// <summary>
    /// Attempt to cast as T returning true and out-ing the cast if successful, otherwise returning false and out-ing null
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="able"></param>
    /// <param name="result"></param>
    /// <returns></returns>
    public static bool TryAs<T>(this IAble able, out T result) where T : class
    {
        if (able is T)
        {
            result = able as T;
            return true;
        }
        else
        {
            result = null;
            return false;
        }
    }

    /// <summary>
    /// Attempt to cast as T returning true and out-ing the cast if successful, otherwise returning false and out-ing null
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="obj"></param>
    /// <param name="result"></param>
    /// <returns></returns>
    public static bool TryAs<T>(this UnityEngine.Object obj, out T result) where T : class
    {
        if (obj is T)
        {
            result = obj as T;
            return true;
        }
        else
        {
            result = null;
            return false;
        }
    }
}

এটির সাহায্যে আপনি যেমন কিছু করতে পারেন:

if (animal.TryAs(out Dog dog))
{
    //Do Dog stuff here because animal is a Dog
}
else
{
    //Cast failed! animal is not a dog
}

গুরুত্বপূর্ণ দ্রষ্টব্য: আপনি যদি কোনও ইন্টারফেস ব্যবহার করে ট্রাইএস () ব্যবহার করতে চান তবে আপনার অবশ্যই সেই ইন্টারফেসটি আইএবেলের উত্তরাধিকারসূত্রে পাওয়া উচিত।

উপভোগ করুন! 🙂

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