C # نطاق المتغيرات مقابل الكائنات عند معلمات إلى طرق

StackOverflow https://stackoverflow.com/questions/624217

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا استفادة واسعة من الميراث، polymorphisim، والتغليف ولكن أنا فقط أدركت أنني لم أكن أعرف سلوك التالية حول نطاق كائن مقابل متغير. ويظهر الفرق بشكل أفضل مع كود:

public class Obj
{
    public string sss {get; set;}

    public Obj()
    {
        sss = "0";
    } 
}     

public partial class testScope : System.Web.UI.Page
 {
    protected void Page_Load(object sender, EventArgs e)
    { 
        Obj a = new Obj(); 
        String sss = "0";            
        Context.Response.Write(sss); // 0

        FlipString(sss);
        FlipString(a.sss);
        Context.Response.Write(sss + a.sss); // 0 0

        FlipObject(a);
        Context.Response.Write(a.sss); // 1
        Context.Response.End();
    }

    public void FlipString(string str)
    { str = "1"; }

    public void FlipObject(Obj str)
    { str.sss = "1"; }
}

وحتى ظننت أنه عندما يتم تمرير متغير إلى أسلوب أن التغيرات تقتصر على نطاق الأسلوب. ولكن يبدو أنه إذا تم تمرير الكائن في الأسلوب الذي يتحول إلى خصائص انها تتجاوز الأسلوب.

وأنا يمكن أن تقبل هذا إذا كانت القاعدة التي يوجد هذا السلوك للمتغيرات الكائن ولا بل في كل شيء. NET هو كائن، سلسلة (مثل واحد في المثال هو System.String) هكذا ماذا يكون حكم، يمكن كيف أتوقع نطاق معلمة أنني تمرير إلى أسلوب؟

هل كانت مفيدة؟

المحلول

وأنت أبدا تمرير <م> الكائن كحجة - أنت فقط من أي وقت مضى تمرير <م> مرجع أو قيمة نوع القيمة. إلا إذا كنت تستخدم الكلمة ref، يتم تمرير الوسائط حسب قيمة - أي القيمة الأولية المعلمة هي القيمة تقييمها من ذي الحجة، ولا ينظر تغييرات على قيمة المعلمة من قبل المتصل

ولكن، من المهم جدا أن نفهم أن قيمة المعلمة (لنوع المرجعية) هو <م> مجرد إشارة . إذا قمت بتغيير محتويات الكائن أن الإشارة تشير إليه، ثم <م> أن تغير <م> سوف أن ينظر إليه من قبل المتصل.

وانها الموضوع الذي يستحق أكثر من بضع فقرات - أقترح عليك أن تقرأ رسالتي عن المعلمة يمر في. NET للحصول على مزيد من المعلومات.

نصائح أخرى

وأعتقد أنني مجرد حظيت بها googleing حولها، وبعض الأشياء في صافي هي أنواع "قيمة" والبعض الآخر "المرجعية" أنواع، وذلك لأنواع قيمة مكرر القيمة عند يتم تنظيم في طريقة، ولكن أنواع المراجع لديها مثل مؤشر أو إشارة تمريرها إلى الطريقة التي تشترك الواضح أن نفس نطاق الوالد. حتى ذلك الحين سؤالي هو: كيف يمكن معرفة ما إذا كان شيء ما هو نوع القيمة أم لا، أرى أن البنيات مثل [إينتس] كلها أنواع القيمة ولكن تظهر سلاسل تتصرف مثل البنيات على الرغم من أنها هي كائنات System.String؟

scroll top