سؤال

المستخدم kokos أجاب رائع ملامح خفية من C# السؤال بذكر using الكلمات الرئيسية.هل يمكنك توضيح ذلك ؟ ما هي الاستخدامات using?

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

المحلول

سبب using البيان هو التأكد من أن الهدف هو التخلص منها في أقرب وقت فإنه يخرج من نطاق وأنها لا تتطلب صريحة رمز لضمان أن يحدث هذا.

كما في فهم 'باستخدام' البيان في C#, ، .NET CLR يحول

using (MyResource myRes = new MyResource())
{
    myRes.DoSomething();
}

إلى

{ // Limits scope of myRes
    MyResource myRes= new MyResource();
    try
    {
        myRes.DoSomething();
    }
    finally
    {
        // Check for a null resource.
        if (myRes != null)
            // Call the object's Dispose method.
            ((IDisposable)myRes).Dispose();
    }
}

نصائح أخرى

لأن الكثير من الناس لا تزال تفعل:

using (System.IO.StreamReader r = new System.IO.StreamReader(""))
using (System.IO.StreamReader r2 = new System.IO.StreamReader("")) {
   //code
}

أعتقد أن الكثير من الناس لا تزال لا تعرف أنك يمكن أن تفعل:

using (System.IO.StreamReader r = new System.IO.StreamReader(""), r2 = new System.IO.StreamReader("")) {
   //code
}

أشياء من هذا القبيل:

using (var conn = new SqlConnection("connection string"))
{
   conn.Open();

    // Execute SQL statement here on the connection you created
}

هذا SqlConnection سوف تكون مغلقة دون الحاجة إلى صراحة استدعاء .Close() وظيفة و هذا لن يحدث حتى لو تم طرح استثناء, دون الحاجة إلى try/catch/finally.

استخدام يمكن استخدامها للاتصال IDisposable.فإنه يمكن أيضا أن تستخدم اسم مستعار أنواع.

using (SqlConnection cnn = new SqlConnection()) { /*code*/}
using f1 = System.Windows.Forms.Form;

باستخدام, بمعنى

using (var foo = new Bar())
{
  Baz();
}

هو في الواقع اختصار ل try/أخيرا كتلة.وهو ما يعادل كود:

var foo = new Bar();
try
{
  Baz();
}
finally
{
  foo.Dispose();
}

فسوف نلاحظ طبعا أن أول مقتطف هو أكثر إيجازا من الثانية كما أن هناك أنواع كثيرة من الأشياء التي قد تريد أن تفعل كما تنظيف حتى لو تم طرح استثناء.بسبب هذا, لقد حان حتى مع الفئة التي نسميها النطاق التي تسمح لك لتنفيذ قانون تعسفي في أسلوب التخلص.لذا, فعلى سبيل المثال, إذا كان لديك خاصية تسمى IsWorking الذي أردت دائما أن تعيين إلى false بعد محاولة تنفيذ العملية ، كنت تفعل ذلك من هذا القبيل:

using (new Scope(() => IsWorking = false))
{
  IsWorking = true;
  MundaneYetDangerousWork();
}

يمكنك قراءة المزيد عن الحل وكيفية اشتقاق الأمر هنا.

لقد استعملت الكثير في الماضي للعمل مع المدخلات والمخرجات تيارات.يمكنك عش لهم بشكل جيد و يأخذ الكثير من المشاكل المحتملة التي عادة تشغيل في (تلقائيا عن طريق الاتصال التصرف).على سبيل المثال:

        using (FileStream fs = new FileStream("c:\file.txt", FileMode.Open))
        {
            using (BufferedStream bs = new BufferedStream(fs))
            {
                using (System.IO.StreamReader sr = new StreamReader(bs))
                {
                    string output = sr.ReadToEnd();
                }
            }
        }

وثائق Microsoft الدول التي باستخدام لديه وظيفة مزدوجة (https://msdn.microsoft.com/en-us/library/zhdeatwt.aspx) ، على السواء ، التوجيه و في البيانات.كما بيان, كما أشير إلى هنا في إجابات أخرى, الكلمة هي الأساس النحوية السكر لتحديد نطاق التصرف غير IDisposable الكائن.كما التوجيه, هو يستخدم بشكل روتيني إلى استيراد مساحات وأنواع.وكذلك التوجيه, يمكنك إنشاء الأسماء المستعارة على مساحات وأنواع, كما أشار في كتاب "C# 5.0 باختصار:دليل قاطع" (http://www.amazon.com/5-0-Nutshell-The-Definitive-Reference-ebook/dp/B008E6I1K8) ، يوسف بن Albahari.مثال واحد:

namespace HelloWorld
{
    using AppFunc = Func<IDictionary<DateTime, string>, List<string>>;
    public class Startup
    {
        public static AppFunc OrderEvents() 
        {
            AppFunc appFunc = (IDictionary<DateTime, string> events) =>
            {
                if ((events != null) && (events.Count > 0))
                {
                    List<string> result = events.OrderBy(ev => ev.Key)
                        .Select(ev => ev.Value)
                        .ToList();
                    return result;
                }
                throw new ArgumentException("Event dictionary is null or empty.");
            };
            return appFunc;
        }
    }
}

هذا هو ما تعتمد بحكمة لأن تعاطي هذه الممارسة يمكن أن يضر وضوح التعليمات البرمجية.وهناك لطيفة شرح C# المستعارة ، كما ذكر إيجابيات وسلبيات ، DotNetPearls (http://www.dotnetperls.com/using-alias).

فقط إضافة القليل من شيء وفوجئت لم تأتي.الميزة الأكثر إثارة للاهتمام من استخدام (في رأيي) هو أن لا الأم كيف الخروج من الحي ، فإنه سوف يتصرف دائما الكائن.وهذا يشمل العوائد والاستثناءات.

using (var db = new DbContext())
{
    if(db.State == State.Closed) throw new Exception("Database connection is closed.");
    return db.Something.ToList();
}

لا يهم إذا كان يتم طرح استثناء أو القائمة التي تم إرجاعها.على DbContext كائن وسوف يكون دائما التخلص منها.

آخر فائدة كبيرة من استخدام عند إنشاء مربع حوار مشروط.

Using frm as new Form1

Form1.ShowDialog

' do stuff here

End Using

في الختام عند استخدام متغير محلي من النوع الذي ينفذ IDisposable, دائما, دون استثناء استخدام using1.

إذا كنت تستخدم غير محلي IDisposable المتغيرات, ثم دائما تنفيذ IDisposable نمط.

اثنين من القواعد البسيطة ، استثناء1.منع الموارد التسريبات خلاف ذلك هو الألم الحقيقي في *ss.


1):والاستثناء الوحيد هو عندما تكون معالجة الاستثناءات.فإنه قد يكون أقل رمز الاتصال Dispose صراحة في finally كتلة.

ومن المثير للاهتمام, يمكنك أيضا استخدام باستخدام/IDisposable نمط الأشياء الأخرى المثيرة للاهتمام (مثل نقطة أخرى من الطريقة التي وحيد القرن يسخر يستخدم).أساسا يمكنك الاستفادة من حقيقة أن المترجم دائما المكالمة .التصرف على "استخدام" الكائن.إذا كان لديك شيء يجب أن يحدث بعد عملية معينة ...شيء واضح بداية ونهاية ...ثم يمكنك ببساطة جعل IDisposable الدرجة التي تبدأ العملية في منشئ ثم ينتهي في أسلوب التخلص.

هذا يتيح لك استخدام لطيف باستخدام بناء الجملة للدلالة الصريحة بداية ونهاية قال العملية.وهذا هو أيضا كيف النظام.المعاملات الأشياء تعمل.

يمكنك جعل استخدام مساحة الاسم المستعار عن طريق المثال التالي:

using LegacyEntities = CompanyFoo.CoreLib.x86.VBComponents.CompanyObjects;

وهذا ما يسمى باستخدام الاسم المستعار التوجيه كما ترون أنها يمكن أن تستخدم لإخفاء مهزار المراجع يجب أن كنت تريد أن تجعل من الواضح في التعليمات البرمجية الخاصة بك ما كنت تقصد على سبيل المثال

LegacyEntities.Account

بدلا من

CompanyFoo.CoreLib.x86.VBComponents.CompanyObjects.Account

أو ببساطة

Account   // It is not obvious this is a legacy entity

عند استخدام ADO.NET يمكنك استخدام keywork لأشياء مثل الاتصال كائن أو كائن القارئ.بهذه الطريقة عندما كتلة التعليمات البرمجية يكمل فإنه سيتم تلقائيا التخلص من الاتصال الخاص بك.

"باستخدام" يمكن أيضا أن تستخدم لحل مساحة اسم الصراعات.انظر http://www.davidarno.org/c-howtos/aliases-overcoming-name-conflicts/ للحصول على البرنامج التعليمي قصيرة كتبت في هذا الموضوع.

public class ClassA:IDisposable

{
   #region IDisposable Members        
    public void Dispose()
    {            
        GC.SuppressFinalize(this);
    }
    #endregion
}

public void fn_Data()

    {
     using (ClassA ObjectName = new ClassA())
            {
                //use objectName 
            }
    }

باستخدام يستخدم عندما يكون لديك الموارد التي تريد التخلص منها بعد استخدامها.

فعلى سبيل المثال إذا كنت تخصيص ملف الموارد و تحتاج فقط إلى استخدام ذلك في قسم واحد من التعليمات البرمجية قليلا القراءة أو الكتابة باستخدام مفيد للتخلص من ملفات الموارد في أقرب وقت كما فعلت بك.

الموارد المستخدمة يحتاج إلى تنفيذ IDisposable للعمل بشكل صحيح.

على سبيل المثال:

using (File file = new File (parameters))
{
    *code to do stuff with the file*
}

استخدام الكلمات الرئيسية يحدد نطاق الكائن ثم يتصرف الكائن عند نطاق كامل.على سبيل المثال.

using (Font font2 = new Font("Arial", 10.0f))
{
    // use font2
}

انظر هنا بالنسبة المقالة MSDN على C# باستخدام الكلمات الرئيسية.

لا أنه أمر جدا مهم ، ولكن باستخدام أيضا يمكن أن تستخدم لتغيير الموارد على الطاير.نعم يمكن التخلص منها كما ذكر في وقت سابق, ولكن ربما على وجه التحديد كنت لا تريد الموارد التي تطابق مع الموارد الأخرى خلال بقية التنفيذ.إذا كنت ترغب في التخلص منها حتى لا تتدخل في أي مكان آخر.

شكرا على التعليقات أدناه ، سوف تنظيف هذا المنصب قليلا (لا يجب استخدام عبارة 'القمامة' في ذلك الوقت ، الاعتذارات):
عندما كنت تستخدم لامتداد ، فإنه سيتم استدعاء الأسلوب التخلص() على الكائن في نهاية باستخدام نطاق.لذلك يمكن أن يكون قليلا جدا من رائعة رمز تنظيف في التخلص الأسلوب ().
النقطة هنا الذي نأمل أن ربما هذا من الامم المتحدة markeddown:إذا قمت بتطبيق IDisposable ، تأكد من الاتصال GC.SuppressFinalize() في التصرف () ، وإلا التلقائي جمع القمامة سوف محاولة للتوصل إلى الصيغة النهائية في مرحلة ما ، على الأقل سيكون مضيعة للموارد إذا كنت قد قمت بالفعل Dispose()د من ذلك.

مثال آخر على استخدام معقول في الكائن على الفور التخلص منها:

using (IDataReader myReader = DataFunctions.ExecuteReader(CommandType.Text, sql.ToString(), dp.Parameters, myConnectionString)) 
{
    while (myReader.Read()) 
    {
        MyObject theObject = new MyObject();
        theObject.PublicProperty = myReader.GetString(0);
        myCollection.Add(theObject);
    }
}

كل شيء خارج الأقواس هو التخلص منها, لذلك هو عظيم التصرف في الأشياء الخاصة بك إذا كنت لا تستخدم لهم.هذا هو لأنه إذا كان لديك كائن SqlDataAdapter و كنت تستخدم مرة واحدة فقط في تطبيق دورة الحياة وأنت ملء واحدة فقط بيانات و لا تحتاج بعد الآن, يمكنك استخدام التعليمات البرمجية:

using(SqlDataAdapter adapter_object = new SqlDataAdapter(sql_command_parameter))
{
   // do stuff
} // here adapter_object is disposed automatically

العبارة باستخدام يوفر الراحة آلية استخدام بشكل صحيح IDisposable الكائنات.كقاعدة عامة, عند استخدام IDisposable كائن يجب أن تعلن مثيل في استخدام البيان.العبارة باستخدام المكالمات أسلوب التخلص على الكائن في الطريق الصحيح ، و (عند استخدامه كما هو مبين في وقت سابق) كما أنه يسبب الكائن نفسه إلى الخروج من نطاق بمجرد التخلص يسمى.داخل الحي ، والهدف من ذلك هو للقراءة فقط ولا يمكن تعديلها أو إعادة تعيينها.

هذا يأتي من: هنا

بالنسبة لي اسم "باستخدام" قليلا مربكة ، لأنه يمكن أن يكون التوجيه إلى استيراد مساحة الاسم أو بيان (مثل واحد مناقشتها هنا) من أجل معالجة الخطأ.

اسم مختلف عن معالجة الخطأ كان جميل, و ربما بطريقة أكثر وضوحا.

فإنه يمكن أيضا أن تستخدم من أجل إيجاد نطاقات على سبيل المثال:

class LoggerScope:IDisposable {
   static ThreadLocal<LoggerScope> threadScope = 
        new ThreadLocal<LoggerScope>();
   private LoggerScope previous;

   public static LoggerScope Current=> threadScope.Value;

   public bool WithTime{get;}

   public LoggerScope(bool withTime){
       previous = threadScope.Value;
       threadScope.Value = this;
       WithTime=withTime;
   }

   public void Dispose(){
       threadScope.Value = previous;
   }
}


class Program {
   public static void Main(params string[] args){
       new Program().Run();
   }

   public void Run(){
      log("something happend!");
      using(new LoggerScope(false)){
          log("the quick brown fox jumps over the lazy dog!");
          using(new LoggerScope(true)){
              log("nested scope!");
          }
      }
   }

   void log(string message){
      if(LoggerScope.Current!=null){
          Console.WriteLine(message);
          if(LoggerScope.Current.WithTime){
             Console.WriteLine(DateTime.Now);
          }
      }
   }

}

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

هناك نوعان من استخدام باستخدام الكلمات الرئيسية في C# على النحو التالي.

  1. كما توجيهات

عموما نحن نستخدم باستخدام الكلمات الرئيسية لإضافة مساحات في التعليمات البرمجية-خلف فئة ملفات.ثم يجعل تتوفر جميع دروس, واجهات فئات مجردة و الأساليب والخصائص في الصفحة الحالية.

مثلا:

using System.IO;  
  1. بيان

هذا هو طريقة أخرى لاستخدام باستخدام الكلمات الرئيسية في C#.أنها تلعب دورا حيويا في تحسين الأداء في جمع القمامة.العبارة باستخدام يضمن أن تخلص() يسمى حتى لو كان استثناء يحدث عند إنشاء كائنات الاتصال أساليب وخصائص وهلم جرا.Dispose() هو طريقة التي هي موجودة في واجهة IDisposable التي تساعد على تنفيذ المخصصة لجمع القمامة.وبعبارة أخرى إذا أنا أفعل بعض عملية قاعدة البيانات (Insert, Update, Delete) ولكن ما يحدث استثناء ثم هنا العبارة باستخدام يغلق الاتصال تلقائيا.لا حاجة لاستدعاء الاتصال الوثيق (طريقة) صراحة.

عامل آخر مهم هو أنه يساعد في تجمع الاتصال.تجمع الاتصال في .صافي يساعد على القضاء على إغلاق اتصال قاعدة بيانات عدة مرات.يرسل كائن اتصال إلى مجموعة لاستخدامها في المستقبل (بجوار قاعدة بيانات الإتصال).في المرة القادمة اتصال قاعدة بيانات تسمى من التطبيق الخاص بك تجمع الاتصال جلب الكائنات المتوفرة في حوض السباحة.لذلك فإنه يساعد على تحسين أداء التطبيق.حتى عندما استخدم العبارة باستخدام وحدة تحكم يرسل الكائن إلى تجمع الاتصال تلقائيا ، هناك حاجة إلى الاتصال الوثيق() والتصرف فيها() أساليب صراحة.

يمكنك أن تفعل نفس ما العبارة باستخدام تقوم باستخدام try-catch و استدعاء Dispose() داخل كتلة أخيرا صراحة.ولكن باستخدام بيان المكالمات تلقائيا لجعل رمز أنظف و أكثر أناقة.داخل الحي ، والهدف من ذلك هو للقراءة فقط ولا يمكن تعديلها أو إعادة تعيينها.

مثلا:

    string connString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;";  

using (SqlConnection conn = new SqlConnection(connString))  
{  
      SqlCommand cmd = conn.CreateCommand();  
      cmd.CommandText = "SELECT CustomerId, CompanyName FROM Customers";  
      conn.Open();  
      using (SqlDataReader dr = cmd.ExecuteReader())  
      {  
         while (dr.Read())  
         Console.WriteLine("{0}\t{1}", dr.GetString(0), dr.GetString(1));  
      }  
}  

في التعليمات البرمجية السابق أنا لا تغلق أي اتصال سوف تغلق تلقائيا.العبارة باستخدام استدعاء conn.Close() تلقائيا بسبب استخدام البيان (باستخدام (SqlConnection conn = new SqlConnection(connString)) و نفس الشيء بالنسبة كائن SqlDataReader.و أيضا إذا كان أي استثناء يحدث أنه سيتم إغلاق الاتصال تلقائيا.

For more info --> https://www.c-sharpcorner.com/UploadFile/manas1/usage-and-importance-of-using-in-C-Sharp472/

على وحيد القرن يسخر سجل التشغيل الجملة يجعل مثيرة للاهتمام استخدام using.

وذلك باستخدام بيان تلقائيا المكالمات التخلص المحدد الكائن.الكائن يجب أن تنفذ واجهة IDisposable.فمن من الممكن استخدام عدة كائنات في بيان واحد طالما هم من نفس النوع.

CLR تحويل الكود إلى MSIL.و العبارة باستخدام يحصل ترجمتها إلى محاولة وأخيرا كتلة.هذا هو كيف يمكن استخدام البيان ممثلة في إلينوي.باستخدام بيان ترجم إلى ثلاثة أجزاء:اقتناء واستخدام والتخلص منها.المورد الأول المكتسبة ، ثم استخدام المغلقة في محاولة التصريح أخيرا شرط.الكائن ثم يحصل التخلص منها في النهاية شرط.

باستخدام شرط يستخدم لتحديد نطاق متغير معين.على سبيل المثال:

     Using(SqlConnection conn=new SqlConnection(ConnectionString)
            {
                Conn.Open()
            // Execute sql statements here.
           // You do not have to close the connection explicitly here as "USING" will close the connection once the object Conn becomes out of the defined scope.
            }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top