সি # তে বিবৃতি ব্যবহার করে নেস্টেড


315

আমি একটি প্রকল্পে কাজ করছি। আমাকে দুটি ফাইলের বিষয়বস্তু তুলনা করতে হবে এবং তারা একে অপরের সাথে যথাযথভাবে মেলে কিনা তা দেখতে হবে।

প্রচুর ত্রুটি-চেকিং এবং বৈধকরণের আগে, আমার প্রথম খসড়াটি হ'ল:

  DirectoryInfo di = new DirectoryInfo(Environment.CurrentDirectory + "\\TestArea\\");
  FileInfo[] files = di.GetFiles(filename + ".*");

  FileInfo outputFile = files.Where(f => f.Extension == ".out").Single<FileInfo>();
  FileInfo expectedFile = files.Where(f => f.Extension == ".exp").Single <FileInfo>();

  using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
  {
    using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
    {
      while (!(outFile.EndOfStream || expFile.EndOfStream))
      {
        if (outFile.ReadLine() != expFile.ReadLine())
        {
          return false;
        }
      }
      return (outFile.EndOfStream && expFile.EndOfStream);
    }
  }

নেস্টেড usingবিবৃতি দেওয়া কিছুটা অদ্ভুত বলে মনে হচ্ছে ।

এই কাজ করতে একটি ভাল উপায় আছে কি?


আমি মনে করি আমি বিবৃতিটি ব্যবহার করে এটি ঘোষণার একটি সিন্ট্যাক্টিক্যালি ক্লিনার উপায় পেয়েছি এবং এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে? IDisposable এর পরিবর্তে আপনার বর্ণনামূলকভাবে বর্ণনামূলক ব্যবহারের ফলে আমার উভয় বস্তু ইনস্ট্যান্ট করার অনুমতি দেয় এবং তারা যে শ্রেণীর সাথে বরাদ্দ করা হয় তাদের বৈশিষ্ট্য এবং পদ্ধতিগুলি কল করতে অনুমতি দেয় (var uow = ইউনিট অফ ওয়ার্কটাইপ 1 (), uow2 = ইউনিট অফ ওয়ার্কটাইপ 2 ()) {}
21:54

উত্তর:


556

এটি করার পছন্দের উপায়টি হ'ল {সর্বশেষ usingবিবৃতি দেওয়ার পরে কেবল একটি উদ্বোধনী ধনুর্বন্ধনী করা :

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamReader expFile = new StreamReader(expectedFile.OpenRead())) 
{
    ///...
}

10
পরিষ্কারক? এবং আপনাকে একই ধরণের ব্যবহার করতে বাধ্য করে না .. প্রবন্ধগুলি পাঠযোগ্যতা এবং ধারাবাহিকতার সাথে মেলে এমনকি আমি সর্বদা এটি এইভাবে করি।
meandmycode

7
@ হার্ড্রিভ: ভিজ্যুয়াল স্টুডিওর অটো-ফর্ম্যাট এটি সরিয়ে দেয়। ধারণাটি পরিবর্তনশীল ঘোষণার তালিকার মতো দেখতে হবে।
এসএলএক্স

41
আমি আরও বেশি পড়ার মতো খুঁজে পেয়েছি কিনা তা নিশ্চিত নই। যদি কিছু থাকে তবে নেস্টেড কোডটির চেহারা ভঙ্গ করে। এবং দেখে মনে হচ্ছে যেন প্রথম ব্যবহারের বিবৃতিটি খালি এবং অব্যবহৃত থাকে। তবে, আমি অনুমান করি যে কখন কী কাজ করে ...: /
জোনাথন ওয়াটনি

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

6
@ ফমুউকে: এটি খুব সত্য নয়; এটা কাজ করবে। নিয়মের জন্য IDisposableযে নিয়মগুলি বলা হয়েছে যে Dispose()দুবার কল করা কিছু করা উচিত নয়। এই নিয়মটি কেবলমাত্র নিম্ন-লিখিত ডিসপোজেবলের ক্ষেত্রে।
এসএলএক্স

138

যদি বস্তুগুলি একই ধরণের হয় তবে আপনি নিম্নলিখিতটি করতে পারেন

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()), 
                    expFile = new StreamReader(expectedFile.OpenRead()))
{
    // ...
}

1
ওয়েল তারা সব একই ধরণের হয় যদি তারা সমস্ত আইডিপোজেবল হয় সম্ভবত কোনও কাস্ট কাজ করবে?
jpierson

8
@ জপিয়ারসন যা কাজ করে, হ্যাঁ, তবে তারপরে আপনি যখন IDisposableব্যবহারের ব্লকের অভ্যন্তর থেকে অবজেক্টগুলি কল করছেন , আমরা ক্লাসের সদস্যদের কাউকে কল করতে পারি না (castালাই ছাড়াই, যা পয়েন্ট ইমোকে পরাস্ত করে)।
কনেল

আইডিস্পোজেবল একটি প্রকার তাই এটি মিশ্রিত প্রকারের একটি তালিকা হিসাবে টাইপ হিসাবে ব্যবহার করুন, যেমন কয়েকটি অন্যান্য উত্তরে দেখা যায়।
ক্রিস রোলিনস

33

এসগুলি IDisposableএকই ধরণের হয়, আপনি নিম্নলিখিতগুলি করতে পারেন:

 using (StreamReader outFile = new StreamReader(outputFile.OpenRead()), 
     expFile = new StreamReader(expectedFile.OpenRead()) {
     // ...
 }

এমএসডিএন পৃষ্ঠায় usingএই ভাষার বৈশিষ্ট্যটিতে ডকুমেন্টেশন রয়েছে।

IDisposableগুলি একই ধরণের হয় কি না আপনি নিম্নলিখিতটি করতে পারেন :

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamWriter anotherFile = new StreamReader(anotherFile.OpenRead()))
{ 
     // ...
}

18

আপনি যদি ব্যবহারের ব্লকের আগে আপনার ব্যবহারের ব্লকের জন্য ভেরিয়েবলগুলি ঘোষণা করতে আপত্তি করেন না, তবে আপনি সেগুলি একই বিবৃতিতে ঘোষণা করতে পারেন could

    Test t; 
    Blah u;
    using (IDisposable x = (t = new Test()), y = (u = new Blah())) {
        // whatever...
    }

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


3
আমি মনে করি এটি আপনার কোডটির দিকে তাকিয়ে কোনও নতুন বিকাশকারীকে বিভ্রান্ত করবে।
জ্যাক 6'15

5
এটি একটি খারাপ অভ্যাস হতে পারে; এটির একটি পার্শ্ব-প্রতিক্রিয়া রয়েছে যে চিকিত্সাগুলি এখনও অব্যাহত থাকবে অযৌক্তিক পুনরুদ্ধার মুক্ত হওয়ার পরেও। মাইক্রোসফ্টের সি # রেফারেন্স অনুসারে, "আপনি রিসোর্স অবজেক্টটি ইনস্ট্যান্ট করতে পারেন এবং তারপরে ব্যবহারের বিবৃতিতে ভেরিয়েবলটি পাস করতে পারেন, তবে এটি সর্বোত্তম অনুশীলন নয় this এই ক্ষেত্রে নিয়ন্ত্রণ নিয়ন্ত্রণের পরে অবজেক্টটি স্কোপে থেকে যায় যদিও এটি ব্যবহারের ব্লকটি ছেড়ে দিবে যদিও এটি হবে সম্ভবত এটির পরিচালনা করা সংস্থানগুলিতে আর অ্যাক্সেস নেই ""
রবার্ট আল্টম্যান

@ রবার্ট অলটম্যান আপনি ঠিক বলেছেন, এবং বাস্তব কোডে আমি অন্য একটি পদ্ধতি ব্যবহার করব (সম্ভবত গ্যাভিন এইচ থেকে একটি)। এটি কেবলমাত্র একটি কম পছন্দসই বিকল্প।
বটজ 3000

আপনি কেবল টাইপকাস্টের সাহায্যে ঘোষণাগুলি ভিতরে নিয়ে যেতে পারেন। এটা কি আরও ভাল হবে?
টিমোথি ব্লেজডেল

9

আপনি যদি ফাইলগুলি দক্ষতার সাথে তুলনা করতে চান তবে স্ট্রিমরিডারগুলি একেবারেই ব্যবহার করবেন না, এবং তারপরে ইউজিংগুলি প্রয়োজনীয় নয় - আপনি তুলনা করতে নিম্ন স্তরের স্ট্রিমের ডেটা বাফারগুলিতে টানতে ব্যবহার করতে পারেন।

আপনি নিজেও সমস্ত ডেটা পড়তে বাঁচাতে প্রথমে বিভিন্ন ফাইল দ্রুত সনাক্ত করতে ফাইল আকারের মতো জিনিসগুলির তুলনা করতে পারেন।


হ্যাঁ, ফাইলের আকার পরীক্ষা করা একটি ভাল ধারণা, আপনার সময় বাঁচায় বা সমস্ত বাইট পড়ে। (+1)
টিমোথিপ

9

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

Connection c = new ...; 
Transaction t = new ...;

using (new DisposableCollection(c, t))
{
   ...
}

নিষ্পত্তিযোগ্য সংগ্রহের জন্য কনস্ট্রাক্টর এই ক্ষেত্রে একটি প্যারাম অ্যারে তাই আপনি নিজের পছন্দমতো খাওয়াতে পারেন।


7

আপনি আরও বলতে পারেন:

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
{
   ...
}

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


6

আপনি অভ্যন্তরীণ সর্বাধিক ব্যবহার ব্যতীত অন্য সকলকে বন্ধনীগুলি বাদ দিতে পারেন:

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
{
  while (!(outFile.EndOfStream || expFile.EndOfStream))
  {
    if (outFile.ReadLine() != expFile.ReadLine())
    {
      return false;
    }
  }
}

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


6

আপনি একাধিক ডিসপোজেবল অবজেক্টগুলিকে এক সাথে কমা দিয়ে স্টেটমেন্টে গ্রুপ করতে পারেন:

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()), 
       expFile = new StreamReader(expectedFile.OpenRead()))
{

}

5

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

সম্পাদনা: একীকরণ কোড উদাহরণ দেখাতে টাইপিং খুব ধীর। প্রত্যেককে +1 করুন।


5

এবং কেবল স্বচ্ছতার সাথে যুক্ত করতে, এক্ষেত্রে প্রতিটি ক্রমিক বিবৃতিটি একটি একক বিবৃতি, (এবং কোনও ব্লক নয়), আপনি সমস্ত বন্ধনী বাদ দিতে পারেন:

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
  using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
    while (!(outFile.EndOfStream || expFile.EndOfStream))  
       if (outFile.ReadLine() != expFile.ReadLine())    
          return false;  

আকর্ষণীয় সমাধান; এটি করা / এমনকি সর্বনিম্ন স্তরের 1 সেট বন্ধনী ব্যবহার করে, বাম-ন্যায়সঙ্গত (ক্লিনার আইএমও) স্ট্যাক করে একই লক্ষ্য অর্জন করে, অন্যরা যে কোনও অধীনতা দেখানোর জন্য উল্লিখিত কসমেটিক নেস্টিংয়ের ইচ্ছাটি সম্বোধন করে।
ব্যবহারকারী 1172173

5

যেহেতু সি # 8.0 আপনি একটি ব্যবহারের ঘোষণাটি ব্যবহার করতে পারেন ।

using var outFile = new StreamReader(outputFile.OpenRead());
using var expFile = new StreamReader(expectedFile.OpenRead());
while (!(outFile.EndOfStream || expFile.EndOfStream))
{
    if (outFile.ReadLine() != expFile.ReadLine())
    {
         return false;
    }
}
return (outFile.EndOfStream && expFile.EndOfStream);

এটি ভেরিয়েবলগুলির স্কোপ শেষে অর্থাত্ পদ্ধতিটির শেষে ব্যবহারযোগ্য ভেরিয়েবলগুলি নিষ্পত্তি করবে।


3

এগুলি সময়ে সময়ে আসে যখন আমি কোড করি। আপনি দ্বিতীয় ফাংশনে স্টেটমেন্ট ব্যবহার করে দ্বিতীয় স্থানান্তর বিবেচনা করতে পারেন?


3

আপনি কি জিজ্ঞাসা করছেন যে ফাইলগুলির সাথে তুলনা করার আরও ভাল উপায় আছে? আমি উভয় ফাইলের জন্য একটি সিআরসি বা এমডি 5 গণনা করতে পছন্দ করি এবং সেগুলির তুলনা করি।

উদাহরণস্বরূপ আপনি নিম্নলিখিত এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন:

public static class ByteArrayExtender
    {
        static ushort[] CRC16_TABLE =  { 
                      0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241, 
                      0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440, 
                      0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40, 
                      0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841, 
                      0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40, 
                      0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41, 
                      0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641, 
                      0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040, 
                      0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240, 
                      0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441, 
                      0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41, 
                      0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840, 
                      0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41, 
                      0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40, 
                      0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640, 
                      0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041, 
                      0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240, 
                      0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441, 
                      0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41, 
                      0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840, 
                      0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41, 
                      0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40, 
                      0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640, 
                      0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041, 
                      0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241, 
                      0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440, 
                      0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40, 
                      0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841, 
                      0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40, 
                      0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41, 
                      0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641, 
                      0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040 };


        public static ushort CalculateCRC16(this byte[] source)
        {
            ushort crc = 0;

            for (int i = 0; i < source.Length; i++)
            {
                crc = (ushort)((crc >> 8) ^ CRC16_TABLE[(crc ^ (ushort)source[i]) & 0xFF]);
            }

            return crc;
        }

একবার আপনি কাজটি শেষ করে ফাইলে তুলনা করা বেশ সহজ:

public bool filesAreEqual(string outFile, string expFile)
{
    var outFileBytes = File.ReadAllBytes(outFile);
    var expFileBytes = File.ReadAllBytes(expFile);

    return (outFileBytes.CalculateCRC16() == expFileBytes.CalculateCRC16());
}

আপনি বিল্ট ইন সিস্টেম.সিকিউরিটি.ক্রিপোগ্রাফি.এমডি 5 ক্লাসটি ব্যবহার করতে পারেন, তবে গণনা করা হ্যাশ একটি বাইট [] তাই আপনাকে এখনও এই দুটি অ্যারে তুলনা করতে হবে।


2
বাইট অ্যারে নেওয়ার পরিবর্তে, পদ্ধতির কোনও Streamঅবজেক্ট নেওয়া উচিত এবং ReadByteপদ্ধতিটি কল করা উচিত যতক্ষণ না এটি ফিরে আসে -1। এটি বড় ফাইলগুলির জন্য প্রচুর পরিমাণে মেমরি সঞ্চয় করবে।
স্ল্যাक्स

তারপরে আপনি কীভাবে সমস্ত বাইটের উপর দিয়ে সিআরসি গণনা করবেন?
টিমোথিপ

ওহ, আমি যা বলেছিলাম তা মনে করবেন না: পি থ্যাঙ্কস, আমি এটি আমার কোডে পরিবর্তন করব: p আমরা কেবল এটি ডেটা ব্যবহার করি <1000 বাইট তাই এখনও সমস্যাগুলি লক্ষ্য করেনি তবে যাইহোক পরিবর্তন হবে
টিমোথিপ

প্রতিবার যখন আপনি ReadByteস্ট্রিমের অবস্থানকে এক বাইট দিয়ে অগ্রসর করেন। অতএব, আপনি যদি এটি -1 (ইওএফ) ফেরত না আসা পর্যন্ত কল করে থাকেন, তবে এটি আপনাকে ফাইলের প্রতিটি বাইট দেবে। এমএসডিএন.মাইক্রোসফট.এইন.উস
লিবারি

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

3

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

পরিবর্তে, আমি এই জাতীয় কিছু সুপারিশ করব:

string directory = Path.Combine(Environment.CurrentDirectory, @"TestArea\");

using (StreamReader outFile = File.OpenText(directory + filename + ".out"))
using (StreamReader expFile = File.OpenText(directory + filename + ".exp"))) 
{
    //...

Path.Combine কোনও পাথটিতে একটি ফোল্ডার বা ফাইলের নাম যুক্ত করবে এবং নিশ্চিত করবে যে পথ এবং নামের মধ্যে ঠিক একটি ব্যাকস্ল্যাশ রয়েছে।

File.OpenText একটি ফাইল খুলবে এবং একটি তৈরি করবে StreamReader

@ এর সাথে একটি স্ট্রিং উপসর্গ রেখে আপনি প্রতিটি ব্যাকস্ল্যাশ এড়াতে পারবেন (যেমন, @"a\b\c")


3

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

using(var uow = new UnitOfWorkType1(), uow2 = new UnitOfWorkType2()){}.

যদি কেউ জানে তবে কেন ঠিক নেই, দয়া করে আমাকে জানান


1
সমস্ত জিনিস একই ধরণের হলে এক লাইনে বেশ কয়েকটি কাজ করে। মিশ্রিত প্রকারগুলিকে () গুলি ব্যবহার করে পৃথক পৃথকভাবে বিভক্ত করতে হয়। তবে এটি ভের সাথে কাজ করে না, আপনাকে একটি প্রকার নির্দিষ্ট করতে হবে (সি # 5 স্পেসিফিকেশন, পি 237)
ক্রিস এফ ক্যারল

0

এটি ব্যবহারের সাধারণ উপায় এবং নিখুঁতভাবে কাজ করে। যদিও এটি বাস্তবায়নের আরও কিছু উপায় রয়েছে। প্রায় প্রতিটি উত্তর ইতিমধ্যে এই প্রশ্নের প্রতিক্রিয়া উপস্থিত রয়েছে। তবে এখানে আমি তাদের সকলকে তালিকাবদ্ধ করছি।

ইতোমধ্যে ব্যবহৃত

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
  {
    using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
    {
      while (!(outFile.EndOfStream || expFile.EndOfStream))
      {
        if (outFile.ReadLine() != expFile.ReadLine())
        return false;
      }
    }
  }

বিকল্প 1

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
    using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
    {
      while (!(outFile.EndOfStream || expFile.EndOfStream))
      {
        if (outFile.ReadLine() != expFile.ReadLine())
        return false;
      }
    }
  }

বিকল্প 2

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()),
                    expFile = new StreamReader(expectedFile.OpenRead()))
   {
      while (!(outFile.EndOfStream || expFile.EndOfStream))
       {
         if (outFile.ReadLine() != expFile.ReadLine())
         return false;
       }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.