در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

امیرحسین احمدی

چند سوال درباره شیء گرایی در سی شارپ

سلام خدمت تمام آی تی پرویی های عزیز. بنده در حال مطالعه مبحث شیء گرایی در زبان برنامه نویسی سی شارپ بودم که یک سری سوالات برام پیش اومد. ممنون میشم اگه اساتید پاسخ بدن.

1. هنگامی که به یک فیلد در کلاس خود مقدار دهیم چه اتفاقی می افتد؟ مقدار داخل فیلد (هنگامی که آن را در کلاس خود مقدار دهی کردیم) به چه کار می آید؟ این فیلد با فیلدی که آن را درون کلاس مقدار دهی نکردیم چه تفاوتی دارد؟

    public class Person
    {
        public string Name = "AmirHossein";
    }

2. در چه صورتی دو شیء بایکدیگر برابرند؟ خروجی کد پایین برای من Not Equal بود:

            Contact oContact1 = new Contact();
            oContact1.Name = "AmirHossein";
            oContact1.Number = "0937";
            oContact1.Email = "a@a.com";

            Contact oContact2 = new Contact();
            oContact2.Name = "AmirHossein";
            oContact2.Number = "0937";
            oContact2.Email = "a@a.com";
            if (oContact1 == oContact2)
                Console.WriteLine("Equal");
            else
                Console.WriteLine("Not Equal");

3. آیا اشیاء و کلاس ها از نوع Reference Type هستند؟


4. و سه سوال آخرم که مهمترین سوالاتم هستند:

- ما برای اینکه یک متغیر رو به عنوان پارامتر به متد پاس بدیم و از اون به جای ورودی، خروجی بگیریم، از کلمه های کلیدی out و ref استفاده می کردیم. حالا من متوجه شدم وقتی یک شیء از یک کلاس رو به عنوان پارامتر به متد پاس میدیم انگار خودش به طور پیشفرض کلمه ref یا out رو داره (منظورم اینه که هرتغییری روی پارامتر مربوطه در متد انجام بدیم، روی شیء ای که به عنوان آرگومان به متد پاس دادیم نیز اتفاق می افته) درسته؟ اون وقت چطور میشه این قابلیت رو غیرفعال کرد (منظورم اینه که چطوری یه کاری کنیم اینطوری نباشه)؟ درضمن من فهمیدم که آرایه هاهم مثل شیء ها این خاصیت رو دارن؟ درسته ؟

-- و این سوالم هم وابسته به سوال بالاست. اون خصوصیت اشیاء (وهمچنین آرایه ها) (همون خصوصیت که هرتغییری روی پارامتر مربوطه در متد انجام بدیم، روی شیء ای که به عنوان آرگومان به متد پاس دادیم نیز اتفاق می افته) به خاطر چیه؟ آیا این خاصیت به خاطر Reference Type بودن اون ها هست؟؟؟ اگه جواب این پرسش بله است، پس چرا نوع های داده ی string و object که میدونیم از نوع Reference Type هستن این خصوصیت رو ندارن؟؟

-- و سوال آخرم که شاید بیشتر مربوط به داده ها باشه تا شی گرایی: من فهمیدم که نوع های داده string و object از نوع Reference Type هستن. اما چرا خروجی کد پایین در هر دو بار "Hello" هست؟ (یعنی چرا بعد از تغییر myStr1، متغیر myStr2 تغییر نکرد؟؟ (همونطور که میدونید در انواع داده رفرنس تایپ، برای مثال در این کد باید پس از عوض کردن مقدار متغیر اول، مقدار متغیر دوم نیز تغییر کنه.)) :

            string myStr1 = "Hello";
            string myStr2 = myStr1;
            Console.WriteLine(myStr2); //myStr2 value: "Hello"
            myStr1 = "Good Bye";
            Console.WriteLine(myStr2); //myStr2 value: "Hello" Again

امیدوارم منظورم رو خوب رسونده باشم. ممنون

این سوال 1 پاسخ دارد.
#شی_گرایی #سی_شارپ #سوال #برنامه_نویسی
لذت یادگیری با توسینسو
به عنوان شخصی که مدت هاست از سایت توسینسو استفاده می کنم باید بگم که واقعاً یکی از بهترین مرجع ها برای ارتقاء دانش شخصی هست. دوره های سایت، راهکارها و مطالب، همگی عالی هستند.

میشه لطفا جواب بدید؟

افرادی که آنقدر دیوانه هستند که فکر می کنند میتوانند دنیا را تغییر دهند، واقعا این کار را انجام می دهند. - استیو جایز

سلام به شما دوست عزیز

برای سوال اولتون اینو بگم که حالتی شاید پیش بیاد که خودتون بخواهید همه ی اشیا شما یک در یک فیلد یک مقدار مشترک داشته باشند. برای مثال شما کلاس برای لوازم خانگی ساخته اید و ولتاژ مصرفی همه ی آنها ۲۲۰ ولت باشد. خب این خصوصیت که مقدار مشترک دارد را از کاربر که دریافت نمی کنید و خودتان آن را مقدار دهی می کنید.

در جواب سوال دوم شما هم باید بگم که وقتی دو شئ با هم برابر هستند که محل ذخیره سازی آنها در حافظه رم یا به عبارت دیگر آدرس آن ها در رم یکی باشد. البته شما می توانید علامت == را override کنید تا شرط دیگری برای مساوی بودن آن در نظر بگیرید.

جواب سوال سوم هم بله هست. چون وقتی که از یک کلاس یک شئ می سازید آدرس آن کلاس را داخل شئ مورد نظر قرار می دهید.

جواب سوال سوم شما هم بله هست. اشیائی که از کلاس ها ساخته می شود وقتی داخل یک تابع ارسال می شوند اگر داخل تابع تغییری کنند این تغییرات بیرون از تابع هم قابل مشاهده است که به این کار pass by reference می گویند. ولی نوع داده های اصلی را به صورت مقدار یا pass by value به تابع ارسال می شوند و تغییرات داخل تابع در بیرون از آن قابل دسترس نیست. حال آرایه ها هم مانند اشیا است. برای این که یک شی را بتوان به صورت pass by value به یک تابع ارسال کرد باید هنگام تعریف کلاس آن شی از اینترفیس ICloneable ارث بری کرد و آن را پیاده سازی نمود که در کد زیر یک نمونه از آن آورده شده است

public class MyClass : ICloneable
{
  private int myValue;

  public MyClass(int val)
  {
     myValue = val;
  }

  public void object Clone()
  {
     return new MyClass(myValue);
  }
}

که شما باید در داخل تابع Clone خودتان عملیات ساخت یک شی جدید را بر عهده بگیرید که به شی اصلی شما تغییری وارد نشود.

دلیل این که در کد بالا خروجی Hello تغییر نکرد این هست که string را اگر بخواهید به یک تابع دیگر ارسال کنید همان لحظه یک شی string ساخته می شود و مقدار رشته موجود در داخل آن کپی می شود. این خاصیت ‌string است

سرنوشت ما با افکارمان تغییر می کند؛ اگر افکارمان همیشه مطابق با خواسته هایمان باشند، همان چیزی می شویم که آرزو داریم و همان کاری را می کنیم که می خواهیم
  • انتخاب شده به عنوان جواب توسط 1 نفر
پاسخ شما
برای ارسال پاسخ خود وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....