সি # তে "ব্যবহার" এর ব্যবহারগুলি কী?


319

ব্যবহারকারী কোকোস কী-ওয়ার্ডের উল্লেখ করে সি # প্রশ্নের বিস্ময়কর লুক্কায়িত বৈশিষ্ট্যগুলির উত্তর দিয়েছেন using। আপনি কি এ সম্পর্কে বিস্তারিত বলতে পারেন? এর ব্যবহার কী using?



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

উত্তর:


480

usingবিবৃতিটির কারণ হ'ল সুযোগটি বাইরে যাওয়ার সাথে সাথে অবজেক্টটি নিষ্পত্তি করা হয়েছে তা নিশ্চিত করা এবং এটি ঘটেছে তা নিশ্চিত করার জন্য এর স্পষ্ট কোডের প্রয়োজন নেই।

মতই সি # (codeproject) এ 'ব্যবহার' বিবৃতি বোঝা এবং যে বস্তু IDisposable (Microsoft) বাস্তবায়ন ব্যবহার , সি # কম্পাইলার ধর্মান্তরিত

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();
    }
}

সি # 8 একটি নতুন সিনট্যাক্স উপস্থাপন করেছে, যার নাম " ঘোষণা ব্যবহার করে ":

একটি ব্যবহারের ঘোষণাপত্রটি হ'ল মূলশব্দ ব্যবহারের পূর্বে একটি পরিবর্তনীয় ঘোষণা। এটি সংকলককে বলে যে ঘোষিত চলকটি ঘেরের সুযোগের শেষে নিষ্পত্তি করা উচিত।

সুতরাং উপরের সমতুল্য কোডটি হ'ল:

using var myRes = new MyResource();
myRes.DoSomething();

এবং নিয়ন্ত্রণ যখন এতে থাকা সুযোগটি ছেড়ে যায় (সাধারণত একটি পদ্ধতি, তবে এটি একটি কোড myResব্লকও হতে পারে ), নিষ্পত্তি হবে।


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

1
দয়া করে নোট করুন যে উত্পন্ন কোডটি যখন MyRessourceস্ট্রাক্ট হয় তখন কিছুটা আলাদা । স্পষ্টতই নালার জন্য কোনও পরীক্ষা নেই, তবে কোনও বক্সিংও নেই IDisposable। একটি সীমাবদ্ধ ভার্চুয়াল কল নির্গত হয়।
রোমেন ভার্দিয়ার 14

4
কেউ কেন উল্লেখ করছে না যে ব্যবহারটি নেমস্পেসগুলি আমদানিতেও ব্যবহৃত হয়?
কাইল ডেলানিতে

3
মনে রাখবেন যে আপনি যদি কোডের সরাসরি দ্বিতীয় সংস্করণটি লিখেন তবে ফলাফলটি একই রকম হয় না। আপনি যদি এটি ব্যবহার করেন usingতবে এর অভ্যন্তরে নির্মিত চলকটি কেবলমাত্র পঠনযোগ্য। usingবিবৃতি ব্যতীত স্থানীয় ভেরিয়েবলের জন্য এটি অর্জন করার কোনও উপায় নেই ।
ম্যাসিমিলিয়ানো ক্রাউস

1
@ জনসন্ডার্স এছাড়াও, চূড়ান্তকরণকারীর আহ্বানের নিশ্চয়তা নেই।
পাবলো এইচ

124

যেহেতু প্রচুর লোক এখনও করছেন:

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
}

2
একক ব্যবহারের বিবৃতিতে বিভিন্ন ধরণের একাধিক অবজেক্ট ব্যবহার করা সম্ভব?
অগ্নেল কুরিয়ান

12
@ অগ্নেলকুরিয়ান নং: "ত্রুটি সিএস 1044: এর জন্য, ব্যবহার, স্থির করা বা ঘোষণার বিবৃতিতে একের বেশি ধরণের ব্যবহার করা যায় না"
ডেভিড সাইকস

10
কিভাবে এই প্রশ্নের উত্তর দেয়?
লিয়াম

আমি আসলে জানতাম না যে আমি কোডের একক ব্লকের আগে স্টেটম্যান ব্যবহার করে দুটি লিখতে পারি (এগুলি প্রতিবার বাসা বাঁধে)।
kub1x

97

এই জাতীয় জিনিস:

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

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

এটি SqlConnectionস্পষ্টভাবে .Close()ফাংশনটি কল করার প্রয়োজন ছাড়াই এটি বন্ধ হয়ে যাবে এবং একটি ব্যতিক্রম নিক্ষেপ করা হলেও এটি ঘটবে , try/ catch/ এর প্রয়োজন ছাড়াই finally


1
যদি আমি কোনও পদ্ধতির অভ্যন্তরে "ব্যবহার" ব্যবহার করি এবং আমি কোনও ব্যবহারের মাঝখানে ফিরে যাই। কোন সমস্যা আছে?
francisco_ssb

1
সমস্যা নেই। এখানে উদাহরণ হিসাবে, সংযোগটি এখনও বন্ধ থাকবে, এমনকি আপনি যদি ব্লকের returnমাঝখানে থেকে থাকেন using
জোয়েল কোহোর্ন

30

আইডিস্পোজেবল কল করতে ব্যবহার করা যেতে পারে। এটি উলামের ধরণের ক্ষেত্রেও ব্যবহৃত হতে পারে।

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

21

অর্থে, ব্যবহার করে

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

আসলে চেষ্টা / শেষ অবরুদ্ধ করার জন্য শর্টহ্যান্ড। এটি কোডের সমতুল্য:

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

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

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

আমাদের সমাধান এবং আমরা কীভাবে এটি এখানে পেয়েছি সে সম্পর্কে আপনি আরও পড়তে পারেন ।


12

মাইক্রোসফ্ট ডকুমেন্টেশন বলছে যে ব্যবহারের একটি ডাবল ফাংশন রয়েছে ( https: //msdn.mic Microsoft.com/en-us/library/zhdeatwt.aspx ), উভয়ই নির্দেশিকা হিসাবে এবং বিবৃতি হিসাবে । একটি বিবৃতি হিসাবে, যেমন এটি এখানে অন্যান্য উত্তরে নির্দেশ করা হয়েছিল, মূল শব্দটি মূলত সিনড্যাকটিক চিনি একটি আইডিস্পোজেবল অবজেক্টের নিষ্পত্তি করার সুযোগ নির্ধারণ করার জন্য । একটি নির্দেশিকা হিসাবে , এটি নিয়মিতভাবে নেমস্পেস এবং প্রকারগুলি আমদানি করতে ব্যবহৃত হয়। এছাড়াও একটি নির্দেশ হিসাবে, আপনি তৈরি করতে পারেন alias লেখা নামব্যবধান এবং ধরনের জন্য, গ্রন্থে সরু আউট হিসাবে "সি # 5.0 সংক্ষেপে: নির্দিষ্ট নির্দেশিকা" ( http://www.amazon.com/5-0-Nutshell-The- নির্দিষ্ট-রেফারেন্স-ইসলাম / ডিপি / B008E6I1K8), জোসেফ এবং বেন আলবাহারি দ্বারা। একটি উদাহরণ:

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;
        }
    }
}

এটি বিজ্ঞতার সাথে গ্রহণ করার মতো বিষয়, যেহেতু এই অনুশীলনের অপব্যবহার কারও কোডের স্পষ্টতাকে আঘাত করতে পারে। ডটনেটপলসগুলিতে ( http://www.dotnetperls.com/used-alias ) সি # এলিয়াসগুলির পক্ষে একটি ভাল ব্যাখ্যা রয়েছে, ভাল এবং বিপরীতে উল্লেখ রয়েছে ।


4
মিথ্যা বলা হবে না: আমি একটি উলামের সরঞ্জাম হিসাবে ব্যবহার ঘৃণা করি using। কোডটি পড়ার সময় এটি আমাকে বিভ্রান্ত করে - আমি ইতিমধ্যে জানি যে এটি System.Collectionsবিদ্যমান এবং IEnumerable<T>ক্লাস রয়েছে। একে অন্যরকম কিছু বলার জন্য একটি উপাধি ব্যবহার করা আমার পক্ষে তা বিস্মৃত হয়। আমি using FooCollection = IEnumerable<Foo>পরে বিকাশকারীদের কোডটি পড়ার একটি উপায় হিসাবে দেখি এবং মনে করি, "কী হ'ল FooCollectionএবং কেন কোথাও এটির জন্য কোনও শ্রেণি নেই?" আমি কখনই এটি ব্যবহার করি না এবং এটির ব্যবহারকে নিরুৎসাহিত করব। কিন্তু যে শুধু আমার হতে পারে।
এরি রোথ

1
সংযোজন: আমি স্বীকার করব যে এটির জন্য মাঝে মধ্যে ব্যবহার হতে পারে যেমন আপনার উদাহরণ হিসাবে যেখানে আপনি এটি একটি প্রতিনিধি সংজ্ঞায়িত করতে ব্যবহার করেন। তবে আমি যুক্তি দেব যেগুলি তুলনামূলকভাবে বিরল।
এরি রথ

10

ইনপুট এবং আউটপুট স্ট্রিমগুলির সাথে কাজ করতে আমি অতীতে এটি প্রচুর ব্যবহার করেছি। আপনি এগুলিকে সুন্দরভাবে বাসাতে পারেন এবং এটি সাধারণত আপনার যে সম্ভাব্য সমস্যার মধ্যে চলে আসে (স্বয়ংক্রিয়ভাবে নিষ্পত্তি কল করে) away উদাহরণ স্বরূপ:

        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();
                }
            }
        }

8

আমি কিছুটা যুক্ত করে যা অবাক করেছিলাম তা উঠে আসে নি। (আমার মতে) ব্যবহারের সবচেয়ে আকর্ষণীয় বৈশিষ্ট্যটি হ'ল আপনি কীভাবে ব্লকটি ব্যবহার করে প্রস্থান করবেন তা কোনও ম্যাটারই নয়, এটি সর্বদা অবজেক্টটিকে নিষ্পত্তি করবে। এর মধ্যে রিটার্ন এবং ব্যতিক্রম অন্তর্ভুক্ত রয়েছে।

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

ব্যতিক্রম নিক্ষেপ করা হয় বা তালিকাটি ফিরে আসে তা বিবেচ্য নয়। DbContext অবজেক্টটি সর্বদা নিষ্পত্তি হবে।


6

কোনও মডেল ডায়ালগ ইনস্ট্যান্ট করার সময় ব্যবহারের আর একটি দুর্দান্ত ব্যবহার।

Using frm as new Form1

Form1.ShowDialog

' do stuff here

End Using

1
আপনি কি frm.SowDialog বোঝাতে চেয়েছিলেন?
UuDdLrLrSs

5

পরিশেষে, যখন আপনি একটি ধরনের একটি স্থানীয় ভেরিয়েবল ব্যবহার করে কার্যকরী IDisposable, সবসময় , ব্যতিক্রম ছাড়া, ব্যবহার using1

আপনি যদি ননলোকাল IDisposableভেরিয়েবল ব্যবহার করেন তবে সর্বদা প্যাটার্নটি প্রয়োগ করুনIDisposable

দুটি সহজ নিয়ম, ব্যতিক্রম নয় 1 । অন্যথায় রিসোর্স ফাঁস রোধ করা * এস এস এর আসল ব্যথা।


1) : একমাত্র ব্যতিক্রম - আপনি যখন ব্যতিক্রমগুলি পরিচালনা করছেন। ব্লকের Disposeমধ্যে স্পষ্টভাবে কল করা কোডের চেয়ে কম কোড হতে পারে finally


5

আপনি নিম্নলিখিত উদাহরণটি দিয়ে উপনাম নামস্থানটি ব্যবহার করতে পারেন:

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

4

মজার বিষয় হল, আপনি অন্যান্য আকর্ষণীয় জিনিসগুলির জন্য / আইডিস্পোজেবল প্যাটার্নটিও ব্যবহার করতে পারেন (যেমন রাইনো মকস যেভাবে এটি ব্যবহার করে তার অন্যান্য পয়েন্ট)। মূলত, আপনি যে সংকলকটি সর্বদা থাকবে তার সুবিধা নিতে পারেন সংকলকটি কল সেটির "" ব্যবহৃত "অবজেক্টটির বিষয়ে আলোচনা করুন। যদি আপনার কিছু নির্দিষ্ট ক্রিয়াকলাপ হওয়ার পরে ঘটে থাকে ... একটি নির্দিষ্ট শুরু এবং শেষ আছে এমন কিছু ... তবে আপনি কেবল একটি আইডিসপোজেবল বর্গ তৈরি করতে পারেন যা নির্মাতার মধ্যে ক্রিয়াকলাপ শুরু করে, এবং পরে ডিসপোজ পদ্ধতিতে শেষ করে।

এটি আপনাকে বলা অপারেশনের সুস্পষ্ট শুরু এবং শেষ বোঝাতে সিনট্যাক্স ব্যবহার করে সত্যই দুর্দান্ত ব্যবহার করতে দেয়। এটিও সিস্টেম T ট্রানজেকশনের স্টাফগুলি কীভাবে কাজ করে।


3

ADO.NET ব্যবহার করার সময় আপনি আপনার সংযোগ অবজেক্ট বা রিডার অবজেক্টের মতো জিনিসগুলির জন্য কীওয়ার্কটি ব্যবহার করতে পারেন। কোড ব্লকটি সম্পূর্ণ হয়ে গেলে এটি স্বয়ংক্রিয়ভাবে আপনার সংযোগটি নিষ্পত্তি করে দেবে।


2
আমি কেবল যুক্ত করব যে কোড ব্লক এমনকি সম্পূর্ণ করতে হবে না। একটি ব্যবহারিক ব্লক এমনকি কোনও নিয়ন্ত্রণহীন ব্যতিক্রম ঘটলে এমনকি সংস্থানটি নিষ্পত্তি করবে।
হার্পো

শুধু আরও কাছে নির্মল, এটা নিশ্চিত গার্বেজ কালেকটর আপনার বরাদ্দ যত্ন যখন আপনি এটি করতে চান লাগে উপার্জন পরিবর্তে এরকম যখন একটি উপায় এটা করতে চায়।
16:28

3

"স্পেসিফিকেশন" ব্যবহার করে নামের স্থান বিরোধগুলি সমাধান করতেও ব্যবহার করা যেতে পারে। আমি এই বিষয়টিতে লিখেছিলাম এমন একটি সংক্ষিপ্ত টিউটোরিয়ালের জন্য http://www.davidarno.org/c-howtos/aliases-over आगामी- name- conflicts / দেখুন ।


3
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 
            }
    }

2

আপনি যখন এমন কোনও রিসোর্স ব্যবহার করবেন যা ব্যবহারের পরে তা নিষ্পত্তি করতে চান তখন ব্যবহার করা হয়।

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

ব্যবহৃত সংস্থানটি সঠিকভাবে কাজ করার জন্য আইডিস্পসোবল কার্যকর করতে হবে।

উদাহরণ:

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

1

ব্যবহারের কীওয়ার্ডটি অবজেক্টের জন্য স্কোপটি সংজ্ঞায়িত করে এবং স্কোপটি সম্পূর্ণ হয়ে গেলে বস্তুর নিষ্পত্তি করে। উদাহরণ স্বরূপ.

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

কীওয়ার্ড ব্যবহার করে সি # তে এমএসডিএন নিবন্ধের জন্য এখানে দেখুন ।


1

এটি অতি গুরুত্বপূর্ণ যে নয়, তবে ফ্লাইয়ের সংস্থানগুলি পরিবর্তনের জন্যও ব্যবহার করা যেতে পারে। হ্যাঁ পূর্বে উল্লিখিত হিসাবে নিষ্পত্তিযোগ্য, তবে সম্ভবত বিশেষভাবে আপনি অন্য বাক্যগুলির কার্যকরকরণের সময় যে সংস্থানগুলি অন্য সংস্থানগুলির সাথে মেলে না সেগুলি চান না। সুতরাং আপনি এটি নিষ্পত্তি করতে চান যাতে এটি অন্য কোথাও হস্তক্ষেপ না করে।


1

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


এর অপ্রত্যক্ষ প্রভাব রয়েছে। আপনি অবজেক্টটি স্পষ্টভাবে নিষ্পত্তি করার কারণে এটি চূড়ান্তকরণের প্রয়োজন হয় না এবং তাই আগে GC করা যেতে পারে।
কেন্ট বুগার্ট

1

যুক্তিসঙ্গত ব্যবহারের আরেকটি উদাহরণ যেখানে অবিলম্বে অবজেক্টটি নিষ্পত্তি করা হয়:

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);
    }
}

1

কোঁকড়ানো বন্ধনীগুলির বাইরের সমস্ত কিছুই নিষ্পত্তি করা হয়, সুতরাং আপনি যদি অবজেক্টগুলি ব্যবহার না করেন তবে তা নিষ্পত্তি করা দুর্দান্ত it এটি এমন কারণ কারণ আপনার যদি স্কলডেটা অ্যাডাপ্টার অবজেক্ট থাকে এবং আপনি অ্যাপ্লিকেশন লাইফ চক্রটিতে কেবল একবার এটি ব্যবহার করছেন এবং আপনি কেবল একটি ডেটাसेट পূরণ করছেন এবং আপনার আর এটির প্রয়োজন নেই, আপনি কোডটি ব্যবহার করতে পারেন:

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

1

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

এটি থেকে এসেছে: এখানে here


1

আমার জন্য "ব্যবহার করা" নামটি কিছুটা বিভ্রান্তিকর, কারণ ত্রুটি পরিচালনার জন্য নেমস্পেস বা বিবৃতি (এখানে আলোচিত মত) আমদানি করার দিকনির্দেশনা হতে পারে।

ত্রুটি পরিচালনার জন্য আলাদা নামটি দুর্দান্ত হত, এবং সম্ভবত এটি আরও সুস্পষ্ট।


1

এটি উদাহরণস্বরূপ স্কোপগুলি তৈরি করতেও ব্যবহার করা যেতে পারে:

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);
          }
      }
   }

}

1

ইউজিং স্টেটমেন্টটি .NET কে বলছে যে একবার ব্যবহার ব্লকটিতে নির্দিষ্ট করা অবজেক্টটি আর প্রয়োজন হবে না এটি ছেড়ে দিতে। সুতরাং আপনার ক্লাসগুলির জন্য 'ব্যবহার' ব্লক ব্যবহার করা উচিত যা তাদের পরে সিস্টেম.আইও প্রকারের মতো পরিষ্কার করা দরকার।


1

usingসি # তে কিওয়ার্ডের দুটি ব্যবহার নিম্নরূপ রয়েছে।

  1. নির্দেশনা হিসাবে

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

    উদাহরণ:

    using System.IO;
  2. বিবৃতি হিসাবে

    এটি usingসি # তে কীওয়ার্ডটি ব্যবহারের অন্য উপায় । এটি আবর্জনা সংগ্রহের কার্যকারিতা উন্নয়নে গুরুত্বপূর্ণ ভূমিকা পালন করে।

    usingবিবৃতি নিশ্চিত করে যে সৎকার () নামক একটি ব্যতিক্রম ঘটে এমনকি যদি আপনি বস্তুর তৈরি করছেন এবং কলিং পদ্ধতি, বৈশিষ্ট্য ইত্যাদি করা হয়। নিষ্পত্তি () হ'ল এমন একটি পদ্ধতি যা আইডিস্পোজযোগ্য ইন্টারফেসে উপস্থিত থাকে যা কাস্টম আবর্জনা সংগ্রহ বাস্তবায়নে সহায়তা করে। অন্য কথায় যদি আমি কিছু ডাটাবেস অপারেশন করছি (সন্নিবেশ করান, আপডেট করুন, মুছুন) তবে কোনওরকম ব্যতিক্রম ঘটে তবে এখানে ব্যবহারের বিবৃতিটি স্বয়ংক্রিয়ভাবে সংযোগটি বন্ধ করে দেয়। স্পষ্টভাবে সংযোগটি বন্ধ () পদ্ধতিতে কল করার দরকার নেই।

    আর একটি গুরুত্বপূর্ণ বিষয় হ'ল এটি সংযোগ পুলিংয়ে সহায়তা করে। .NET- এ সংযোগ পুলিং একাধিকবার একটি ডাটাবেস সংযোগ বন্ধ করতে সহায়তা করে। এটি ভবিষ্যতে ব্যবহারের জন্য (পরের ডাটাবেস কল) জন্য একটি পুলে সংযোগ বস্তুকে প্রেরণ করে। পরের বার যখন আপনার অ্যাপ্লিকেশন থেকে একটি ডাটাবেস সংযোগ ডেকে আনা হবে তখন সংযোগের পুলটিতে উপলব্ধ অবজেক্টগুলি আনবে। সুতরাং এটি অ্যাপ্লিকেশনটির কার্যকারিতা উন্নত করতে সহায়তা করে। সুতরাং যখন আমরা ব্যবহারের বিবৃতিটি ব্যবহার করি তখন কন্ট্রোলারটি স্বয়ংক্রিয়ভাবে সংযোগ পুলে অবজেক্টটি প্রেরণ করে, ক্লোজ () এবং ডিসপোজ () পদ্ধতিগুলি স্পষ্টভাবে কল করার দরকার নেই।

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

    উদাহরণ:

    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));
          }
    }

পূর্ববর্তী কোডে আমি কোনও সংযোগ বন্ধ করছি না; এটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে। usingবিবৃতি কারণে স্বয়ংক্রিয়ভাবে conn.Close (কল হবে) usingবিবৃতি ( using (SqlConnection conn = new SqlConnection(connString)) এবং একটি SqlDataReader বস্তুর জন্য একই। এবং যদি কোনও ব্যতিক্রম ঘটে তবে এটি সংযোগটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।

আরও তথ্যের জন্য দেখুন, সি # তে ব্যবহারের ব্যবহার এবং গুরুত্ব


0

গণ্ডার ঠাট্টা রেকর্ড-প্লেব্যাক সিনট্যাক্স এর একটি আকর্ষণীয় ব্যবহার করে using


এটি মূলত প্লেব্যাক কল করার মতো এবং এটি যাচাই করা যাচাই করা ঠিক যেমন ডিসপোজ () পদ্ধতিতে করে
জর্জ মাউয়ার

-1

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

সিএলআর আপনার কোডটি এমএসআইএলে রূপান্তর করে। এবং ব্যবহারের বিবৃতিটি চেষ্টা করে অনুবাদ করা হয় এবং অবশেষে ব্লক হয়ে যায়। আইএল-তে এভাবে ব্যবহারের বিবৃতি উপস্থাপন করা হয়। একটি ব্যবহারের বিবৃতিটি তিন ভাগে অনুবাদ করা হয়: অধিগ্রহণ, ব্যবহার এবং নিষ্পত্তি। সংস্থানটি প্রথমে অধিগ্রহণ করা হয়, তারপরে ব্যবহারটি একটি শেষ বিবরণ দিয়ে একটি চেষ্টা বিবৃতিতে সংযুক্ত থাকে। এরপরে অবজেক্টটি শেষ অবধি নিষ্পত্তি হয়।


-3

ক্লজ ব্যবহার করে নির্দিষ্ট ভেরিয়েবলের স্কোপ সংজ্ঞায়িত করতে ব্যবহৃত হয়। উদাহরণ স্বরূপ:

     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.
            }

এটি কাউকে বিভ্রান্ত করতে পারে, ব্যবহার করে অবজেক্টগুলি নিষ্পত্তি করার জন্য। হতে পারে আপনি কোড ব্লকের সাথে এটিকে বিভ্রান্ত করছেন, যদি আপনি কোনও ভেরিয়েবলের পরিধি সীমাবদ্ধ করতে চান তবে আপনি তার জন্য নেস্টেড কোড ব্লক ব্যবহার করতে পারেন: পাবলিক স্ট্যাটিক শূন্য মূল (প্যারাম স্ট্রিং [] আরগস) {{// নেস্টেড কোড ব্লক}}
লুইসুয়ারডহড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.