সি # বা .NET এর মধ্যে সবচেয়ে খারাপ গোটচা কী? [বন্ধ]


377

আমি সম্প্রতি একটি DateTimeবস্তুর সাথে কাজ করছি , এবং এরকম কিছু লিখেছি:

DateTime dt = DateTime.Now;
dt.AddDays(1);
return dt; // still today's date! WTF?

এর জন্য ইন্টেলিজেন্স ডকুমেন্টেশন AddDays()বলে যে এটি তারিখের সাথে একটি দিন যুক্ত করে, যা এটি দেয় না - এটি আসলে যুক্ত হওয়া দিনের সাথে একটি তারিখ ফেরত দেয়, সুতরাং আপনাকে এটি লিখতে হবে:

DateTime dt = DateTime.Now;
dt = dt.AddDays(1);
return dt; // tomorrow's date

এই একজন আমাকে এর আগে বেশ কয়েকবার দংশন করেছে, তাই আমি ভেবেছিলাম সবচেয়ে খারাপ সি # গেটছগুলি তালিকাভুক্ত করা কার্যকর হবে।


157
ডেটটাইম.নউ.এডডয়েস (1) ফেরত দিন;
ক্র্যাশমাস্ট্র

23
আফাইক, মান প্রকারভেদে নির্মিত সমস্ত অপরিবর্তনীয়, অন্তত এই ধরণের অন্তর্ভুক্ত যে কোনও পদ্ধতি বিদ্যমান আইটেমটি পরিবর্তনের পরিবর্তে কোনও নতুন আইটেম দেয়। কমপক্ষে, আমি আমার মাথার উপরের কোনওটি এটি করতে পারি না তা ভাবতে পারি না: সব সুন্দর এবং ধারাবাহিক।
জোয়েল কোহোর্ন

6
পরিবর্তনীয় মানের ধরণ: সিস্টেম.কলেশনস.জেনারিক্স.লিস্ট.শিক্ষক :( (এবং হ্যাঁ, আপনি যদি যথেষ্ট চেষ্টা করেন তবে এটি অদ্ভুত আচরণ করতে দেখবেন))
জন স্কিটি

13
ইন্টেলিজেন্স আপনাকে আপনার প্রয়োজনীয় সমস্ত তথ্য দেয়। এটি বলে যে এটি একটি ডেটটাইম অবজেক্ট প্রদান করে। আপনি যদি পাস করেছেন কেবল যদি এটি পরিবর্তিত হয় তবে এটি একটি শূন্য পদ্ধতি হবে।
জন ক্রাফ্ট 21

20
অগত্যা নয়: স্ট্রিংবিল্ডার.অ্যাপেন্ড (...) উদাহরণস্বরূপ "এটি" প্রদান করে। সাবলীল ইন্টারফেসে এটি বেশ সাধারণ।
জন স্কিটি

উত্তর:


304
private int myVar;
public int MyVar
{
    get { return MyVar; }
}

Blammo। আপনার অ্যাপ কোনও স্ট্যাক ট্রেস ছাড়াই ক্র্যাশ হয়েছে। সব সময় ঘটে.

( গেটরে MyVarছোট হাতের পরিবর্তে myVarমূলধনটি লক্ষ্য করুন ))


112
এবং এই সাইটের জন্য উপযুক্ত উপযুক্ত :)
gbjbaanb

62
আমি প্রাইভেট মেম্বারের উপর আন্ডারস্কোর লাগিয়েছি, অনেক সাহায্য করে!
চকৃত

61
আমি যেখানে পারি সেখানে স্বয়ংক্রিয় বৈশিষ্ট্যগুলি ব্যবহার করি, এই ধরণের সমস্যা
অনেকটা

28
আপনার ব্যক্তিগত ক্ষেত্রগুলির জন্য উপসর্গগুলি ব্যবহারের এটি দুর্দান্ত কারণ (অন্যরাও আছেন তবে এটি ভাল)): _myVar, m_myVar
জ্রিস্টা

205
@ জ্রিস্টা: ও প্লিজ না, না ... মি ... ... ভয়াবহতা দেখান ...
ফ্রেটজে

254

Type.GetType

আমি দেখেছি যে তিনি প্রচুর লোককে কামড়ান Type.GetType(string)। তারা বিস্মিত হয় যে এটি কেন তাদের নিজস্ব সমাবেশে প্রকারের জন্য কাজ করে, এবং কিছু ধরণের পছন্দ করে System.Stringতবে তা নয় System.Windows.Forms.Form। উত্তরটি হ'ল এটি কেবল বর্তমান সমাবেশ এবং এর মধ্যে দেখায় mscorlib


নামবিহীন পদ্ধতি

সি # 2.0 বেনামে পদ্ধতিগুলি প্রবর্তন করেছে, যার ফলে ন্যক্কারজনক পরিস্থিতিতে পড়ে:

using System;
using System.Threading;

class Test
{
    static void Main()
    {
        for (int i=0; i < 10; i++)
        {
            ThreadStart ts = delegate { Console.WriteLine(i); };
            new Thread(ts).Start();
        }
    }
}

কী ছাপবে? ঠিক আছে, এটি পুরোপুরি সময়সূচীর উপর নির্ভর করে। এটি 10 ​​সংখ্যা মুদ্রণ করবে, তবে এটি 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 মুদ্রণ করবে না যা আপনি আশা করতে পারেন। সমস্যা হলো হয় iপরিবর্তনশীল যা বন্দী করা হয়েছে, প্রতিনিধি সৃষ্টির সময়ে না তার মান। এটি সঠিক সুযোগের অতিরিক্ত স্থানীয় ভেরিয়েবলের সাথে সহজেই সমাধান করা যেতে পারে:

using System;
using System.Threading;

class Test
{
    static void Main()
    {
        for (int i=0; i < 10; i++)
        {
            int copy = i;
            ThreadStart ts = delegate { Console.WriteLine(copy); };
            new Thread(ts).Start();
        }
    }
}

পুনরুদ্ধারকারী ব্লকগুলি স্থগিত কার্যকর করা

এই "বেচারার ইউনিট পরীক্ষা" পাস হয় না - কেন হয় না?

using System;
using System.Collections.Generic;
using System.Diagnostics;

class Test
{
    static IEnumerable<char> CapitalLetters(string input)
    {
        if (input == null)
        {
            throw new ArgumentNullException(input);
        }
        foreach (char c in input)
        {
            yield return char.ToUpper(c);
        }
    }

    static void Main()
    {
        // Test that null input is handled correctly
        try
        {
            CapitalLetters(null);
            Console.WriteLine("An exception should have been thrown!");
        }
        catch (ArgumentNullException)
        {
            // Expected
        }
    }
}

উত্তরটি হ'ল CapitalLettersকোডটির উত্সের মধ্যে কোডটি পুনরাবৃত্তকারীটির MoveNext()পদ্ধতিটি না বলা হওয়া পর্যন্ত কার্যকর করা হয় না ।

আমি আমার ব্রেইনটিজার পৃষ্ঠায় কিছু অন্যান্য বিজোড়তা পেয়েছি ।


25
পুনরাবৃত্তির উদাহরণটি ভ্রান্ত!
জিমি

8
কেন এটিকে 3 টি উত্তরে বিভক্ত করবেন না যাতে আমরা সবাইকে একসাথে বদলে ভোট দিতে পারি?
চকৃত

13
@ চাচার্ট: পিছনের দিক থেকে, এটি সম্ভবত একটি ভাল ধারণা হতে পারে তবে আমি মনে করি এখন অনেক দেরী হয়ে গেছে। এটি দেখে মনে হতে পারে আমি আরও
বিশিষ্টতা অর্জনের

19
প্রকৃতপক্ষে টাইপ.গেটটাইপ কাজ করে যদি আপনি অ্যাসেম্বলকিউলিফাইডনেম সরবরাহ করেন। টাইপ.গেটটাইপ ("সিস্টেম.সোর্সোমোডেল.এন্ডপয়েন্টনিটফাউন্ডএক্সেপশন, সিস্টেম.সোর্সোমোডেল, সংস্করণ = 3.0.0.0, সংস্কৃতি = নিরপেক্ষ, পাবলিককি টোকেন = b77a5c561934e089");
চিলটেম্প

2
@ কেন্তারমিউউরা: ওভারলোড রেজোলিউশনটি সবচেয়ে উত্সযুক্ত ধরণের থেকে শুরু হয় এবং গাছটি তৈরি করে - তবে কেবল যে পদ্ধতিটি দেখছে তাতে মূলত ঘোষিত পদ্ধতিগুলি দেখছি। Foo (int) বেস পদ্ধতিটি ওভাররাইড করে, তাই বিবেচনা করা হয় না। ফু (অবজেক্ট) প্রযোজ্য, সুতরাং ওভারলোড রেজোলিউশনটি সেখানে থামে। অদ্ভুত, আমি জানি।
জন স্কিটি

194

পুনরায় নিক্ষেপ ব্যতিক্রম

এমন একটি গেটচা যা প্রচুর নতুন বিকাশকারী হয়, এটি হ'ল পুনরায় নিক্ষেপ ব্যতিক্রমী শব্দার্থক শব্দ।

অনেক সময় আমি নীচের মত কোড দেখতে পাচ্ছি

catch(Exception e) 
{
   // Do stuff 
   throw e; 
}

সমস্যাটি হ'ল এটি স্ট্যাক ট্রেসটি মোছা করে এবং রোগ নির্ণয়ের সমস্যাগুলি আরও শক্ত করে তোলে, কারণ ব্যতিক্রমটি কোথায় ঘটেছে তা আপনি ট্র্যাক করতে পারবেন না।

সঠিক কোডটি হয় কোনও বিনা ছাড়াই নিক্ষিপ্ত বিবৃতি:

catch(Exception)
{
    throw;
}

বা ব্যতিক্রমটিকে অন্য একটিতে মোড়ানো, এবং মূল স্ট্যাক ট্রেস পেতে অভ্যন্তরীণ ব্যতিক্রমগুলি ব্যবহার করে:

catch(Exception e) 
{
   // Do stuff 
   throw new MySpecialException(e); 
}

খুব ভাগ্যক্রমে, আমি আমার প্রথম সপ্তাহে এই সম্পর্কে কেউ শিখিয়েছি এবং এটি আরও সিনিয়র বিকাশকারীদের কোডে পেয়েছি। হয়: ধরা () {নিক্ষেপ; Code দ্বিতীয় কোড স্নিপেট একই? ধরা (ব্যতিক্রম ই) {নিক্ষেপ; } কেবল এটিই কোনও ব্যতিক্রমী অবজেক্ট তৈরি করে তা জনবসতিপূর্ণ নয়?
স্টুপারউজার

কেবল নিক্ষেপের পরিবর্তে থ্রো এক্স (বা থ্রো ই) ব্যবহার করার ত্রুটি ছাড়াও আমাকে অবাক করে বলতে হবে যে যখন সেখানে কেবলমাত্র আবার ছুঁড়ে ফেলার জন্য ব্যতিক্রম ধরা পড়ে তখন কী কী ঘটনা ঘটে।
রায়ান লুন্ডি

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

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

5
@ কাইরলেস সবচেয়ে বড় ক্ষেত্রে হ'ল যখন আপনাকে লগিং করতে হয়। ধরাতে ত্রুটিটি লগইন করুন, এবং পুনর্বিবেচনা ..
নওফাল

194

হাইজেনবার্গ ওয়াচ উইন্ডো

আপনি যদি লোড-অন-ডিমান্ড স্টাফগুলি করেন তবে এটি আপনাকে খারাপভাবে কামড়াতে পারে:

private MyClass _myObj;
public MyClass MyObj {
  get {
    if (_myObj == null)
      _myObj = CreateMyObj(); // some other code to create my object
    return _myObj;
  }
}

এখন আসুন বলি যে এটিকে ব্যবহার করে অন্য কোথাও আপনার কিছু কোড রয়েছে:

// blah
// blah
MyObj.DoStuff(); // Line 3
// blah

এখন আপনি আপনার CreateMyObj()পদ্ধতিটি ডিবাগ করতে চান । সুতরাং আপনি কোডটিতে পদক্ষেপ নেওয়ার অভিপ্রায় সহ উপরের লাইন 3 তে একটি ব্রেকপয়েন্ট রেখেছেন। কেবলমাত্র ভাল পরিমাপের জন্য, আপনি উপরের লাইনে একটি ব্রেকপয়েন্টও রেখেছেন যা বলেছে _myObj = CreateMyObj();, এমনকি CreateMyObj()নিজের ভিতরে একটি ব্রেকপয়েন্টও রয়েছে ।

কোডটি 3 লাইনে আপনার ব্রেকপয়েন্টে আঘাত করে You আপনি কোডটিতে প্রবেশ করুন। আপনি শর্তসাপেক্ষ কোডটি প্রবেশ করার প্রত্যাশা করছেন, কারণ _myObjস্পষ্টতই নাল, তাই না? আহ ... তো ... কেন এটি শর্ত এড়িয়ে সরাসরি সোজা চলে গেল return _myObj?! আপনি আপনার মাউসকে _YYBj এর উপর দিয়ে রাখুন ... এবং সত্যই, এর কোনও মূল্য আছে! কীভাবে হয়েছিল ?!

উত্তরটি হ'ল আপনার আইডিই এটির মান পেয়েছে কারণ আপনার একটি "ওয়াচ" উইন্ডো খোলা রয়েছে - বিশেষত "অটোস" ওয়াচ উইন্ডো যা কার্যকরকরণের বর্তমান বা পূর্ববর্তী লাইনের সাথে সম্পর্কিত সমস্ত ভেরিয়েবল / বৈশিষ্ট্যের মান প্রদর্শন করে। আপনি যখন লাইন 3 তে আপনার ব্রেকপয়েন্টে পৌঁছেছেন তখন ঘড়ির উইন্ডোটি সিদ্ধান্ত নিয়েছে যে আপনার কোনও ব্রেকপয়েন্টকে উপেক্ষাMyObj করে পর্দার আড়ালে - এর মূল্য জানতে আগ্রহী হবেন , এটা গিয়েছিলাম এবং এর মান গণনা করা MyObjআপনার জন্য - থেকে কল সহ CreateMyObj()যে _myObj এর মান নির্ধারণ করে!

এই কারণেই আমি এটিকে হাইজেনবার্গ ওয়াচ উইন্ডো বলছি - আপনি মানটিকে প্রভাবিত না করে পর্যবেক্ষণ করতে পারবেন না ... :)

Gotcha!


সম্পাদনা করুন - আমি মনে করি @ ক্রিশ্চিয়ান হাইটারের মন্তব্যটি মূল উত্তরের অন্তর্ভুক্তির দাবিদার, কারণ এটি এই ইস্যুটির জন্য কার্যকর কার্যকর মনে হচ্ছে। সুতরাং যে কোনও সময় আপনার অলস বোঝা সম্পত্তি রয়েছে ...

আপনার সম্পত্তিটি [ডিবাগার ব্রাউজেবল (ডিবাগ ব্রাউজেবল স্টেট.নেভার)] বা "ডিবাগারডিসপ্লে (" <দাবির উপর চাপানো> ")) দিয়ে সাজান। - খ্রিস্টান হেইটার


10
উজ্জ্বল সন্ধান! আপনি প্রোগ্রামার নন, আপনি সত্যিকারের ডিবাগার।
এই __curious_geek

26
আমি কেবল ঘড়ির উইন্ডো নয়, চলকটির উপরেও এটি ঘুরে দেখছি।
রিচার্ড মরগান

31
[DebuggerBrowsable(DebuggerBrowsableState.Never)]বা আপনার সম্পত্তি সাজাতে [DebuggerDisplay("<loaded on demand>")]
খ্রিস্টান হাইটার

4
আপনি যদি কোনও ফ্রেমওয়ার্ক শ্রেণীর বিকাশ করছেন এবং অলসভাবে নির্মিত-সম্পত্তি হিসাবে রানটাইম আচরণের পরিবর্তন না করে উইন্ডো কার্যকারিতা দেখতে চান, আপনি যদি ডিবাগার টাইপ প্রক্সিটি ইতিমধ্যে নির্মিত হয়েছে তবে মানটি ফেরত দিতে এবং সম্পত্তিটি না থাকা এমন একটি বার্তা ব্যবহার করতে পারেন যদি এটি হয় তবে নির্মাণ করা হয়েছে। Lazy<T>বর্গ (তার জন্য বিশেষ করে Valueসম্পত্তি) যেখানে এই ব্যবহার করা হয় এক উদাহরণ।
স্যাম হারওয়েল

4
আমি এমন কাউকে স্মরণ করি যিনি (কোনও কারণে আমি জানতে পারি না) একটি ওভারলোডে অবজেক্টের মান পরিবর্তন করে ToString। যতবারই তিনি এটির উপরে নজর রেখেছিলেন সেই টুলটিপটি তাকে আলাদা আলাদা মূল্য দিয়েছিল - সে তা বুঝতে পারে না ...
জেএনএফ

144

এখানে অন্য সময় যা আমাকে পেয়ে যায়:

static void PrintHowLong(DateTime a, DateTime b)
{
    TimeSpan span = a - b;
    Console.WriteLine(span.Seconds);        // WRONG!
    Console.WriteLine(span.TotalSeconds);   // RIGHT!
}

টাইমস্প্যান.সেকেন্ডসটি টাইমস্পানের সেকেন্ডের অংশ (2 মিনিট এবং 0 সেকেন্ডের 0 সেকেন্ডের মান হয়)।

টাইমস্প্যান.টোটাল সেকেন্ডসটি সেকেন্ডে পরিমাপ করা পুরো টাইমস্প্যান (2 মিনিটের মোট সেকেন্ডের মান 120 হয়)।


1
হ্যাঁ, সে আমাকেও পেয়েছে। আমি মনে করি এটি টাইমস্প্যান.সেকেন্ডস পার্ট বা এটি কী প্রতিনিধিত্ব করে তা আরও স্পষ্ট করার জন্য এমন কিছু হওয়া উচিত।
ড্যান ডিপ্লো

3
এটি পুনরায় পড়ার পরে, আমাকে ভাবতে হবে কেন TimeSpanএমনকি কেন একটি সম্পত্তি আছেSeconds । যিনি একটি ইঁদুরের গাধা একটি টাইমস্প্যান এর সেকেন্ডের অংশটি যাইহোক, দেয়? এটি একটি নির্বিচারে, ইউনিট-নির্ভর মূল্য; আমি এর ব্যবহারিক ব্যবহার সম্পর্কে ধারণা করতে পারি না।
MusiGenesis

2
আমাকে বুঝায় যে টাইমস্প্যান.টোটাল সেকেন্ডগুলি ফিরে আসবে ... সময়ের ব্যবধানে সেকেন্ডের মোট সংখ্যা।
এড এস

16
@ মুসিগেনেসিস সম্পত্তিটি দরকারী। আমি যদি টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে প্রদর্শন করতে চাই? উদাহরণস্বরূপ বলা যাক আপনার টাইমস্প্যান '3 ঘন্টা 15 মিনিট 10 সেকেন্ড' এর সময়কাল উপস্থাপন করে। সেকেন্ড, ঘন্টা, মিনিট বৈশিষ্ট্য ব্যতীত আপনি কীভাবে এই তথ্যটি অ্যাক্সেস করতে পারেন?
সমাধান

1
অনুরূপ এপিআইগুলিতে, আমি দুটি ব্যবহার করেছি SecondsPartএবং SecondsTotalআলাদা করতে পারি।
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

80

মেমরি ফাঁস হচ্ছে কারণ আপনি ইভেন্টগুলি হুক করেননি।

এটি আমার পরিচিত কয়েকজন প্রবীণ বিকাশকারীকেও ধরা দিয়েছে।

এতে ডাব্লুপিএফ ফর্মটি প্রচুর পরিমাণে কল্পনা করুন এবং কোথাও কোথাও আপনি কোনও ইভেন্টের সদস্যতা নিয়েছেন। আপনি যদি সাবস্ক্রাইব না করেন তবে পুরো ফর্মটি বন্ধ হয়ে যাওয়ার পরে এবং ডি-রেফারেন্স করার পরে স্মৃতিতে রাখা হবে।

আমি বিশ্বাস করি যে সমস্যাটি আমি দেখেছি তা ডাব্লুপিএফ ফর্মটিতে একটি ডিসপ্যাচটাইমার তৈরি করছে এবং টিক ইভেন্টটি সাবস্ক্রাইব করছে, যদি আপনি টাইমারে আপনার ফর্মটি ফাঁস করে না -!

এই উদাহরণে আপনার টিয়ারডাউন কোড থাকা উচিত

timer.Tick -= TimerTickEventHandler;

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


1
কৌশলটি হ'ল আপনার তৈরি সমস্ত ইভেন্টের সাবস্ক্রিপশন সর্বদা প্রকাশ করা। যদি আপনি আপনার জন্য ফর্মগুলির উপর নির্ভর করতে শুরু করেন তবে আপনি নিশ্চিত হয়ে উঠতে পারেন যে আপনি অভ্যাসে চলে যাবেন এবং একদিন এমন কোনও ঘটনা যেখানেই করা দরকার সেখানে প্রকাশ করতে ভুলে যাবেন।
জেসন উইলিয়ামস

3
সেখানে দুর্বল রেফারেন্স ইভেন্টের জন্য MS-কানেক্ট পরামর্শ এখানে যা এই সমস্যার সমাধান হবে, যদিও আমার মতে আমরা শুধু সম্পূর্ণরূপে অবিশ্বাস্যভাবে দরিদ্র ঘটনা মডেল একটি স্বাস্থ্যহীন-কাপল্ড এক সঙ্গে, ক্যাব দ্বারা ব্যবহৃত যে ভালো প্রতিস্থাপন করা উচিত নয়।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

আমার কাছ থেকে +1, ধন্যবাদ! ঠিক আছে, কোডটি পর্যালোচনা কাজের জন্য আমাকে ধন্যবাদ জানাতে হয়নি!
বব ডেনি

@ ব্লুরাজা-ড্যানিপ্লুঘুফুট দুর্বল ইভেন্টগুলির সাথে আপনার আরও একটি গোচা রয়েছে - আপনি ল্যাম্বডাস সাবস্ক্রাইব করতে পারবেন না। আপনি লিখতে পারবেন নাtimer.Tick += (s, e,) => { Console.WriteLine(s); }
আরক-কুন

@ অর্ক-কুন হ্যাঁ ল্যাম্বডাস আরও শক্ত করে তোলে, আপনাকে আপনার ল্যাম্বদা একটি পরিবর্তনশীল হিসাবে সংরক্ষণ করতে হবে এবং এটি আপনার টিয়ারডাউন কোডে ব্যবহার করতে হবে। কিন্ডা লম্পটস লেখার সরলতা নষ্ট করে না?
টিমোথি ওয়াল্টার

63

আচরণটি এমএসডিএন-তে স্পষ্টভাবে লেখা হয়েছে, তবে আমার ঘাড়ে একবার ভেঙে গেছে কারণ আমি এটির পরিবর্তে স্বজ্ঞাত বলে মনে করেছি:

Image image = System.Drawing.Image.FromFile("nice.pic");

"nice.pic"চিত্রটি নিষ্পত্তি না হওয়া পর্যন্ত এই লোকটি ফাইলটিকে লক করে রেখে দেয় । যে সময় আমি এটির মুখোমুখি হয়েছিলাম আমি যদিও ফ্লাইতে আইকনগুলি লোড করা ভাল লাগত এবং বুঝতে পারি না (প্রথম দিকে) যে আমি কয়েক ডজন খোলা এবং লক করা ফাইল দিয়ে শেষ করেছি! ছবিটি কোথা থেকে ফাইলটি লোড করেছে তা ট্র্যাক করে ...

কীভাবে সমাধান করবেন? আমি ভেবেছিলাম যে একজন ওলাইনার কাজটি করবে। আমি অতিরিক্ত প্যারামিটার আশা করেছিলাম FromFile(), তবে কিছুই ছিল না, তাই আমি এটি লিখেছিলাম ...

using (Stream fs = new FileStream("nice.pic", FileMode.Open, FileAccess.Read))
{
    image = System.Drawing.Image.FromStream(fs);
}

10
আমি সম্মত হই যে এই আচরণটি কোনও অর্থবোধ করে না। "এই আচরণটি ডিজাইনের মাধ্যমে হয়" ব্যতীত আমি এর জন্য কোনও ব্যাখ্যা পাই না।
মুসিজেনেসিস

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

55
কিছু কোড চেক করা প্রয়োজন। BRB।
এসবেন স্কভ পেডারসেন 12'12

7
@ এসবেনসকভ পেডারসন এ জাতীয় একটি সহজ তবে মজার এবং শুকনো মন্তব্য। আমার দিন তৈরি।
ইনিশির

51

আপনি যদি এএসপি.এনইটি গণনা করেন তবে আমি বলতে পারি যে ওয়েবফর্মস জীবনচক্রটি আমার কাছে বেশ বড় একটা গোটাচা। দুর্বল লিখিত ওয়েবফর্ম কোডগুলি ডিবাগ করার জন্য আমি অগণিত ঘন্টা ব্যয় করেছি, কারণ কেবলমাত্র অনেক ইভেন্ট বিকাশকারী কখন কোন ইভেন্ট হ্যান্ডলারটি ব্যবহার করতে হয় তা সত্যই বুঝতে পারে না (আমার অন্তর্ভুক্ত, দুঃখের সাথে)।


26
সে কারণেই আমি এমভিসিতে চলে এসেছি ... ভিউস্টেট মাথাব্যথা ...
চক্র

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

1
মিউজিনিসিস আমি আশা করি আপনার মন্তব্যটি আমি কয়েকশবার ভোট দিতে পারতাম।
সিউউভ

3
@ মুসিজেনেসিস এটি এখন বিভ্রান্ত বলে মনে হচ্ছে তবে সেই সময় লোকেরা তাদের ওয়েব অ্যাপ্লিকেশনগুলির (উইন্ডোজ অ্যাপ্লিকেশনগুলির মতোই আচরণ করার জন্য মূল অ্যাপ্লিকেশনগুলির মূল শব্দ - এএসপি.নেট ওয়েবফোর্মগুলি আসলে একটি ব্লগ হোস্ট করার জন্য ডিজাইন করা হয়নি) চেয়েছিল। এটি সম্প্রতি তুলনামূলকভাবে পরিবর্তিত হয়েছে এবং প্রচুর লোক এখনও "বেশিরভাগ সেখানে নেই"। পুরো সমস্যা হল বিমূর্ততা উপায় খুব ছিদ্রময় ছিল - ওয়েব একটি ডেস্কটপ অ্যাপ্লিকেশন মত আচরণ করা হয়নি এত এটা প্রায় সবাই বিভ্রান্তি হতে।
লুয়ান

1
হাস্যকরভাবে যথেষ্ট, এএসপি.নেট সম্পর্কে আমি প্রথম যে জিনিসটি দেখেছি তা হ'ল মাইক্রোসফ্টের একটি ভিডিও যা আপনি সহজেই এএসপি.নেট ব্যবহার করে একটি ব্লগ সাইট তৈরি করতে পারবেন তা দেখিয়েছিল!
মুসিজেনেসিস ২

51

অতিরিক্ত লোড == অপারেটর এবং অপরিশোধিত পাত্রে (অ্যারেলিস্ট, ডেটাসেট ইত্যাদি):

string my = "my ";
Debug.Assert(my+"string" == "my string"); //true

var a = new ArrayList();
a.Add(my+"string");
a.Add("my string");

// uses ==(object) instead of ==(string)
Debug.Assert(a[1] == "my string"); // true, due to interning magic
Debug.Assert(a[0] == "my string"); // false

সলিউশন?

  • string.Equals(a, b)আপনি যখন স্ট্রিং ধরণের তুলনা করছেন তখন সর্বদা ব্যবহার করুন

  • জেনেরিকগুলি ব্যবহার করে List<string>উভয় অপারেশন স্ট্রিং রয়েছে তা নিশ্চিত করতে পছন্দ করে।


6
আপনি সেখানে অতিরিক্ত স্পেস পেয়েছেন যা এগুলিকে ভুল করে তোলে - তবে আপনি যদি ফাঁকা জায়গাটি বের করেন তবে শেষ লাইনটি এখনও সত্য হবে কারণ "আমার" + "স্ট্রিং" এখনও একটি ধ্রুবক হিসাবে রয়েছে।
জন স্কিটি

1
স্বীকারোক্তি করুন! আপনি ঠিক বলেছেন :) ঠিক আছে, আমি কিছুটা সম্পাদনা করেছি।
জিমি

এই ধরনের ব্যবহারের উপর একটি সতর্কতা উত্পন্ন হয়।
চকৃত

11
হ্যাঁ, সি # ভাষার সাথে সবচেয়ে বড় ত্রুটিগুলির মধ্যে একটি হল == শ্রেণীর অবজেক্টে অপারেটর। তাদের আমাদের উচিত রেফারেন্সএকোয়ালগুলি ব্যবহার করতে বাধ্য করা উচিত ছিল।
এরিক্ক্যালেন

2
ধন্যবাদ, ২.০ থেকে আমাদের জেনেরিকস রয়েছে। আপনি অ্যারেলিস্টের পরিবর্তে উপরের উদাহরণে <স্ট্রিং> তালিকা ব্যবহার করছেন কিনা তা নিয়ে চিন্তার কম কারণ নেই। এছাড়াও আমরা এর থেকে পারফরম্যান্স অর্জন করেছি, হ্যাঁ! আমি আমাদের লিগ্যাসি কোডটিতে অ্যারেলিস্টগুলির পুরানো রেফারেন্সগুলি সর্বদা উত্সাহিত করি।
জোয়েলসি

48
[Serializable]
class Hello
{
    readonly object accountsLock = new object();
}

//Do stuff to deserialize Hello with BinaryFormatter
//and now... accountsLock == null ;)

গল্পের নৈতিক: কোনও বস্তুর বিশৃঙ্খলা করার সময় ফিল্ড ইনিশিয়ালারগুলি চালিত হয় না


8
হ্যাঁ, আমি ঘৃণা করি। আমি ইচ্ছা করি কোনও কনস্ট্রাক্টরকে ফোন না করেই কোনও অবজেক্ট তৈরি করা অসম্ভব, তবে হায় আফসোস তা হয় না।
রোমান স্টারকভ

45

ডেটটাইম.টোস স্ট্রিং ("ডিডি / এমএম / ইয়ে") ; এটি আসলে হবে না সবসময় আপনার DD / MM / YYYY কিন্তু এর পরিবর্তে এটি যেখানে আপনি উপর নির্ভর করে একাউন্টে আঞ্চলিক সেটিংস নিতে এবং আপনার তারিখ বিভাজক প্রতিস্থাপন করবে দেব। সুতরাং আপনি ডিডি-এমএম-ইয়ে বা একসাথে কিছু পেতে পারেন।

এটি করার সঠিক উপায় হ'ল ডেটটাইম.টিস্ট্রিং ("ডিডি '/' এমএম '/' ইয়াই") ব্যবহার করা;


ডেটটাইম.টোস্ট্রিং ("r") GMC ব্যবহার করে আরএফসি 1123 এ রূপান্তর করার কথা। জিএমটি ইউটিসি থেকে এক সেকেন্ডের ভগ্নাংশের মধ্যে রয়েছে এবং এখনও "আর" ফর্ম্যাট স্পেসিফায়ার ইউটিসিতে রূপান্তর করে না , এমনকি প্রশ্নে থাকা ডেটটাইম স্থানীয় হিসাবে নির্দিষ্ট করা হলেও।

নিম্নলিখিত গোটচায় ফলাফল (আপনার স্থানীয় সময় ইউটিসি থেকে কতটা দূরে তার উপর নির্ভর করে):

DateTime.Parse("Tue, 06 Sep 2011 16:35:12 GMT").ToString("r")
>              "Tue, 06 Sep 2011 17:35:12 GMT"

উপস!


19
মিমি এমএম-তে পরিবর্তিত হয়েছে - মিমি কয়েক মিনিট, এবং এমএম হয় কয়েক মাস। আরেকটি গোছা, আমার ধারণা ...
কোবি

1
আমি দেখতে পেলাম যে এটি কীভাবে হবে যদি আপনি এটি না জানতেন (আমি না) ... তবে আমি যখন আপনি নির্দিষ্টভাবে একটি তারিখ মুদ্রণের চেষ্টা করছেন তখন আপনি এমন আচরণ কখন চান তা নির্ধারণ করার চেষ্টা করছি আপনার আঞ্চলিক সেটিংস কি মেলে না।
বেসকা 16

6
@ বেসকা: যেহেতু আপনি কোনও ফাইলে লিখছেন, যে নির্দিষ্ট তারিখের ফর্ম্যাট সহ একটি নির্দিষ্ট বিন্যাসে থাকা দরকার।
জিভিএস

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

32
আসলে আমি এই হবে করার সঠিক উপায় হল বিশ্বাসDateTime.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture);
ড্যানি Pflughoeft - BlueRaja

44

আমি এটিকে অন্য দিন পোস্ট করে দেখেছি এবং আমি মনে করি এটি বেশ অস্পষ্ট এবং যারা জানেন না তাদের জন্য বেদনাদায়ক

int x = 0;
x = x++;
return x;

যে হিসাবে প্রত্যাশিত হবে হিসাবে 0 এবং 1 না ফিরে আসবে


37
আমি আশা করি যে এটি আসলে মানুষকে কামড়ায় না - আমি সত্যিই আশা করি তারা এটি প্রথম স্থানে লিখবেন না! (এটি যাইহোক, অবশ্যই আকর্ষণীয়))
জন স্কিটি

12
আমার মনে হয় না এটি খুব অস্পষ্ট ...
ক্রিস মারাস্তি-জর্জি

10
কমপক্ষে, সি # এ, ফলাফলগুলি সংজ্ঞায়িত করা হয়, যদি অপ্রত্যাশিত হয়। সি ++ এ এটি 0 বা 1, বা প্রোগ্রাম সমাপ্তি সহ অন্য কোনও ফলাফল হতে পারে!
জেমস কারান

7
এটি গোটচা নয়; x = x ++ -> x = x, তারপরে ইনক্রিমেন্ট এক্স .... x = ++ এক্স -> ইনক্রিমেন্ট এক্স তারপর এক্স = এক্স
কেভিন

28
@ কেভিন: আমি মনে করি না যে এটি এত সহজ। যদি x = x ++ x ++ এর পরে x ++ এর সমান হয়, তবে ফলাফলটি x = 1 হবে Instead পরিবর্তে, আমি মনে করি যা ঘটেছিল প্রথমে সমান চিহ্নটির ডানদিকে প্রকাশ করা হয় (0 প্রদান করা হয়), তবে x হয় বর্ধিত (এক্স = 1 প্রদান), এবং অবশেষে অ্যাসাইনমেন্টটি সম্পাদন করা হয় (আবার x = 0 প্রদান করা)।
টিম গুডম্যান

39

আমি এই পার্টিতে কিছুটা দেরি করেছি, তবে আমার দুটি গোছা রয়েছে যা উভয়ই আমাকে সম্প্রতি দংশন করেছে:

ডেটটাইম রেজোলিউশন

টিক্স সম্পদটি একটি সেকেন্ডের ১০০ মিলিয়নতম সময়ে (100 ন্যানোসেকেন্ড ব্লক) সময় পরিমাপ করে, তবে রেজোলিউশনটি 100 ন্যানোসেকেন্ড নয়, এটি প্রায় 15 মিমি।

এই কোড:

long now = DateTime.Now.Ticks;
for (int i = 0; i < 10; i++)
{
    System.Threading.Thread.Sleep(1);
    Console.WriteLine(DateTime.Now.Ticks - now);
}

আপনাকে একটি আউটপুট দেবে (উদাহরণস্বরূপ):

0
0
0
0
0
0
0
156254
156254
156254

একইভাবে, আপনি যদি ডেটটাইম.এখন.মিলিসেকেন্ডের দিকে তাকান, আপনি 15,525 মিমি: 15, 31, 46, ইত্যাদি গোলাকার অংশগুলিতে মান পাবেন etc.

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


Path.Combine

ফাইল পাথ একত্রিত করার একটি দুর্দান্ত উপায়, তবে এটি আপনি যেভাবে প্রত্যাশা করতেন তা সবসময় আচরণ করে না।

দ্বিতীয় প্যারামিটারটি যদি একটি দিয়ে শুরু হয় \ অক্ষর এটি আপনাকে একটি সম্পূর্ণ পথ দেয় না:

এই কোড:

string prefix1 = "C:\\MyFolder\\MySubFolder";
string prefix2 = "C:\\MyFolder\\MySubFolder\\";
string suffix1 = "log\\";
string suffix2 = "\\log\\";

Console.WriteLine(Path.Combine(prefix1, suffix1));
Console.WriteLine(Path.Combine(prefix1, suffix2));
Console.WriteLine(Path.Combine(prefix2, suffix1));
Console.WriteLine(Path.Combine(prefix2, suffix2));

আপনাকে এই আউটপুট দেয়:

C:\MyFolder\MySubFolder\log\
\log\
C:\MyFolder\MySubFolder\log\
\log\

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

2
@ মুসিগেনেসিস: আমি জানি (এখন) এটি কীভাবে কাজ করে তবে আমার কাছে এমন একটি সঠিক ব্যবস্থা নেওয়া বিভ্রান্তিকর বলে মনে হচ্ছে যা সত্যিকারের সঠিক নয়। এটি বলার মতো যে আমি ন্যানোমিটারগুলিতে আমার উচ্চতা জানি যখন সত্যই আমি কেবল এটি প্রায় নিকটতম দশ কোটির দিকে ঘুরছি।
দামোভিসা

7
ডেটটাইম একক টিক পর্যন্ত সংরক্ষণ করতে যথেষ্ট সক্ষম; এটি ডেটটাইম ow এখন যে নির্ভুলতা ব্যবহার করছে না।
রুবেন

16
অতিরিক্ত '\' হ'ল অনেকগুলি ইউনিক্স / ম্যাক / লিনাক্স লোকদের কাছে একটি গোচা। উইন্ডোজে, যদি নেতৃস্থানীয় '\' থাকে, এর অর্থ হল যে আমরা ড্রাইভের মূলটি যেতে চাই (অর্থাত সি :) CDআমার অর্থ কী তা দেখতে একটি কমান্ড দিয়ে চেষ্টা করুন .... 1) গোটো C:\Windows\System322) টাইপ CD \Users3) ওহো! এখন আপনি এখানে C:\Users... বুঝেছেন? ... পাথ.কোমাইন (@ "সি: \ উইন্ডোজ \ সিস্টেম 32", @ "\ ব্যবহারকারী") এর প্রত্যাবর্তন করা উচিত \Usersযার অর্থ [current_drive_here]:\Users
হ'ল

8
এমনকি 'ঘুম' ছাড়াও এটি একইভাবে সম্পাদন করে। অ্যাপটি প্রতি 15 এমএসে নির্ধারিত হওয়ার সাথে এর কোনও সম্পর্ক নেই nothing ডেটটাইম.ইউটিউনও নামে পরিচিত নেটিভ ফাংশনটির গেটসিসটেমটাইমসফাইটাইম, খুব কম রেজোলিউশন হিসাবে উপস্থিত বলে মনে হচ্ছে।
জিম্বো

38

আপনি যখন কোনও প্রক্রিয়া শুরু করেন (সিস্টেম.ডায়াগনস্টিক্স ব্যবহার করে) যা কনসোলে লেখেন, তবে আপনি কখনই কনসোলটি পড়বেন না utআউট স্ট্রিম, নির্দিষ্ট পরিমাণ আউটপুট দেওয়ার পরে আপনার অ্যাপ্লিকেশনটি স্তব্ধ হয়ে দেখা দেবে।


3
আপনি এখনও stdout এবং stderr উভয় পুনর্নির্দেশ এবং ক্রমানুসারে দুটি ReadToEnd কল ব্যবহার করুন যখন একই হতে পারে। Stdout এবং stderr উভয়েরই নিরাপদ পরিচালনার জন্য আপনাকে তাদের প্রত্যেকের জন্য একটি পঠিত থ্রেড তৈরি করতে হবে।
সেবাস্তিয়ান এম

34

লিনাক-টু-স্কোলে কোনও অপারেটর শর্টকাট নেই

এখানে দেখুন ।

সংক্ষেপে, একটি লিনক-টু-এসকিএল কোয়েরির শর্তসাপেক্ষ ধারার ভিতরে আপনি শর্তযুক্ত শর্টকাটগুলি ব্যবহার করতে পারবেন না ||এবং &&নাল রেফারেন্স ব্যতিক্রমগুলি এড়ানোর জন্য; লিনক-টু-এসকিএল প্রথম শর্তটি দ্বিতীয় শর্তটি মূল্যায়নের প্রয়োজনীয়তা স্বীকার করে এমনকি OR বা AND অপারেটরের উভয় পক্ষের মূল্যায়ন করে!


8
তিল। বিআরবি, কয়েক শতাধিক
লিনকুই

30

ভার্চুয়াল পদ্ধতিতে ডিফল্ট পরামিতি ব্যবহার করা

abstract class Base
{
    public virtual void foo(string s = "base") { Console.WriteLine("base " + s); }
}

class Derived : Base
{
    public override void foo(string s = "derived") { Console.WriteLine("derived " + s); }
}

...

Base b = new Derived();
b.foo();

আউটপুট:
উত্পন্ন বেস


10
অদ্ভুত, আমি ভেবেছিলাম এটি সম্পূর্ণ সুস্পষ্ট। যদি ঘোষিত প্রকারটি হয় Base, তবে সংকলকটি যদি না থেকে ডিফল্ট মানটি পায় Base? আমি ভেবেছি এটি আরও কিছুটা গোছা যে ঘোষিত প্রকারটি উদ্ভূত প্রকারের ক্ষেত্রে পূর্বনির্ধারিত মানটি আলাদা হতে পারে , যদিও (স্ট্যাটিকালি) নামক পদ্ধতিটি বেস পদ্ধতি।
টিমভি

1
কেন কোনও পদ্ধতির একটি প্রয়োগকরণ অন্য প্রয়োগের ডিফল্ট মান পাবে?
staafl

1
@staafl ডিফল্ট যুক্তিগুলি রানটাইম নয়, সংকলন-সময়ে সমাধান করা হয়।
ফ্রেডওভারফ্লো

1
আমি বলব যে এই গোটচা সাধারণভাবে ডিফল্ট পরামিতি - লোকেরা প্রায়শই বুঝতে পারে না যে তারা রান-টাইমের পরিবর্তে সংকলন-সময়ে সমাধান হয়েছে।
লুয়ান

4
@ ফ্রেড ওভারফ্লো, আমার প্রশ্নটি ধারণাগত ছিল। যদিও আচরণটি বাস্তবায়নটিকে বোঝা করে তোলে, তবে এটি অনাদায়ী এবং ত্রুটির সম্ভাব্য উত্স। আইএমএইচও সি # সংকলককে ওভাররাইড করার সময় ডিফল্ট প্যারামিটার মান পরিবর্তন করার অনুমতি দেওয়া উচিত নয়।
staafl

27

পরিবর্তনীয় সংগ্রহগুলিতে মান বস্তু

struct Point { ... }
List<Point> mypoints = ...;

mypoints[i].x = 10;

কোন প্রভাব আছে।

mypoints[i]একটি Pointমান অবজেক্টের একটি অনুলিপি প্রদান করে । সি # সুখে আপনাকে কপির একটি ক্ষেত্র পরিবর্তন করতে দেয়। চুপচাপ কিছুই করছে না।


আপডেট: এটি সি # 3.0 এ ঠিক করা হয়েছে বলে মনে হচ্ছে:

Cannot modify the return value of 'System.Collections.Generic.List<Foo>.this[int]' because it is not a variable

6
আমি দেখতে পাচ্ছি কেন এটি বিভ্রান্তিকর, বিবেচনা করে যে এটি সত্যই অ্যারে (আপনার উত্তরের বিপরীতে) দিয়ে কাজ করে তবে তালিকা <পয়েন্ট> এর মতো অন্যান্য গতিশীল সংগ্রহগুলির সাথে নয়।
লাসে ভি কার্লসেন

2
তুমি ঠিক বলছো. ধন্যবাদ। আমি আমার উত্তর ঠিক করেছি :)। arr[i].attr=। অ্যারে জন্য বিশেষ সিনট্যাক্স যে আপনি পারেন গ্রন্থাগার পাত্রে কোড নয়; (কেন (<মান অভিব্যক্তি>) ATTR = <expr> সমস্ত অনুমতি এটি আগের জানার জন্য যাবে না।?
Bjarke এবার্ট

1
@ বার্জার এবার্ট: এমন কিছু ঘটনা রয়েছে যেখানে এটি অর্থবহ হয়ে উঠবে, তবে দুর্ভাগ্যক্রমে সংকলককে সেগুলি সনাক্ত এবং অনুমতি দেওয়ার কোনও উপায় নেই। নমুনা ব্যবহারের পরিস্থিতি: একটি অপরিবর্তনীয় কাঠামো যা "ঘোরানো / ফ্লিপ" সূচক সহ বর্গাকার দ্বি-মাত্রিক অ্যারের রেফারেন্স ধারণ করে। কাঠামো নিজেই অপরিবর্তনীয় হবে, সুতরাং কেবলমাত্র পঠনযোগ্য উদাহরণের উপাদানগুলিতে লেখা ভাল হওয়া উচিত, তবে সংকলকটি জানতে পারবে না যে সম্পত্তি সেটটারটি আসলে কাঠামোটি লিখছে না, এবং এটি এটি অনুমতি দেবে না ।
সুপারক্যাট

25

সম্ভবত সবচেয়ে খারাপ নয়, তবে। নেট ফ্রেমওয়ার্কের কিছু অংশ ডিগ্রি ব্যবহার করে অন্যরা রেডিয়ান ব্যবহার করে (এবং ইন্টেলিসেন্সের সাথে প্রদর্শিত ডকুমেন্টেশন আপনাকে কখনই বলে না যে, আপনাকে এমএসডিএন দেখতে হবে)

Angleপরিবর্তে একটি ক্লাস করে এগুলি এড়ানো যেত ...


আমি আশ্চর্য হয়েছি যে এগুলি অনেক উপার্জন পেয়েছে, আমার অন্যান্য
গ্যাটাচগুলি এর

22

সি / সি ++ প্রোগ্রামারদের জন্য, সি # তে রূপান্তরটি প্রাকৃতিক। তবে, ব্যক্তিগতভাবে আমি যে সবচেয়ে বড় গোচা চালিয়েছি (এবং অন্যদের সাথে একই রূপান্তর ঘটেছে তা দেখেছি) C # তে ক্লাস এবং স্ট্রাক্টের মধ্যে পার্থক্য পুরোপুরি বুঝতে পারছে না।

সি ++ এ, ক্লাস এবং স্ট্রাক্টগুলি অভিন্ন; এগুলি কেবলমাত্র ডিফল্ট দৃশ্যমানতার মধ্যেই পৃথক, যেখানে শ্রেণিগুলি ব্যক্তিগত দৃশ্যমানতার জন্য ডিফল্ট হয় এবং পাবলিক দৃশ্যমানতার জন্য ডিফল্ট স্ট্রাক্ট করে। সি ++ এ, এই শ্রেণীর সংজ্ঞা

    class A
    {
    public:
        int i;
    };

কার্যকরীভাবে এই কাঠামোর সংজ্ঞার সমতুল্য।

    struct A
    {
        int i;
    };

সি # তে, ক্লাসগুলি রেফারেন্স ধরণের এবং স্ট্রাক্টগুলি মান ধরণের হয়। এটি (1) একে অপরের উপর কখন ব্যবহার করা হবে তা সিদ্ধান্ত নেওয়ার ক্ষেত্রে (2) বস্তুর সমতা পরীক্ষা করা (3) পারফরম্যান্স (যেমন, বক্সিং / আনবক্সিং) ইত্যাদির মধ্যে বিগ পার্থক্য তৈরি করে

ওয়েবের মধ্যে উভয়ের মধ্যে পার্থক্য সম্পর্কিত সমস্ত ধরণের তথ্য রয়েছে (যেমন, এখানে )। আমি সি # তে রূপান্তরকারী যে কোনও ব্যক্তিকে কমপক্ষে পার্থক্য এবং তার প্রভাব সম্পর্কে কার্যকরী জ্ঞান থাকতে খুব উত্সাহিত করব।


13
সুতরাং, সবচেয়ে খারাপ গ্যাচা লোকেরা ভাষা ব্যবহারের আগে ভাষা শেখার জন্য সময় নেওয়ার জন্য বিরক্ত করছে না?
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

3
@ ব্লুরাজা-ড্যানিফ্লুঘুফুট আরও স্পষ্টতই অনুরূপ ভাষার ক্লাসিক গোটার মতো - তারা খুব অনুরূপ কীওয়ার্ড এবং অনেক ক্ষেত্রে বাক্য গঠন ব্যবহার করে তবে অনেকগুলি ভিন্ন উপায়ে কাজ করে।
লুয়ান

19

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


2
() ব্লক ব্যবহার করা ঝরঝরেভাবে এই সমস্যার সমাধান করে। আপনি যখনই ডিসপোজ করার জন্য কল দেখেন, আপনি তত্ক্ষণাত এবং নিরাপদে রিফ্যাক্টর () ব্যবহার করে ব্যবহার করতে পারেন।
জেরেমি ফ্রে

5
আমি মনে করি উদ্বেগটি সঠিকভাবে আইডিস্পোজেবল বাস্তবায়ন করেছিল।
মার্ক ব্রাকেট ২

4
অন্যদিকে, ব্যবহার () অভ্যাস আপনাকে অপ্রত্যাশিতভাবে কামড় দিতে পারে যেমন পিনভোকের সাথে কাজ করার সময়। আপনি এমন কিছু নিষ্পত্তি করতে চান না যা এপিআই এখনও রেফারেন্স করছে।
মুসিজিনিসিস

3
আইডিস্পোজেবলকে সঠিকভাবে প্রয়োগ করা খুব কঠিন এবং এমনকি এই (। নেট ফ্রেমওয়ার্ক গাইডলাইনস) এর মধ্যে আমি যে সেরা পরামর্শ পেয়েছি তা অবশেষে "না পেয়ে" প্রয়োগ করা বিভ্রান্তিকর হতে পারে।
Quibbleome

1
আইডিজেপেসেবলের জন্য আমি যে সেরা পরামর্শটি পেয়েছি তা হ'ল স্টিফেন ক্লিয়ারি থেকে, তিনটি সহজ নিয়ম এবং আইডিসপোজেবলের উপর গভীরতার নিবন্ধ সহ
রোমান স্টারকভ

19

অ্যারে বাস্তবায়ন IList

তবে তা বাস্তবায়ন করবেন না। আপনি যখন অ্যাড কল করবেন তখন এটি আপনাকে বলবে যে এটি কাজ করে না। সুতরাং যখন কোনও শ্রেণি কোনও ইন্টারফেসটি যখন এটি সমর্থন করতে পারে না তখন তা প্রয়োগ করে কেন?

সংকলন, কিন্তু কাজ করে না:

IList<int> myList = new int[] { 1, 2, 4 };
myList.Add(5);

আমাদের এই সমস্যাটি অনেক আছে, কারণ সিরিয়ালাইজার (ডাব্লুসিএফ) সমস্ত আইএললিস্টগুলিকে অ্যারেতে পরিণত করে এবং আমরা রানটাইম ত্রুটি পাই।


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

@ সুপের্যাট, এটি প্রাথমিক এবং নির্দিষ্ট দীর্ঘকালীন কোডারদের জন্য নরক হিসাবে বিভ্রান্তিকর হবে। আমি NET সংগ্রহ এবং তাদের ইন্টারফেস বিস্ময়করভাবে মার্জিত মনে হয়। তবে আমি আপনার নম্রতার প্রশংসা করি। ;)
জর্দান

@ জর্দান: উপরের লেখার পরে, আমি সিদ্ধান্ত নিয়েছি যে কোনও সম্পত্তি উভয়কেই সমর্থন IEnumerable<T>এবং IEnumerator<T>সমর্থন করার Featuresপাশাপাশি আরও কিছু " alচ্ছিক " পদ্ধতি যাঁর কার্যকারিতা "বৈশিষ্ট্যগুলি" দ্বারা প্রতিবেদনিত দ্বারা নির্ধারিত হবে তার পক্ষে আরও ভাল উপায় হতে পারে। আমি আমার মূল বিষয়টির সাথে দাঁড়িয়েছি, যদিও এটি এমন কিছু ক্ষেত্রে রয়েছে যে কোড প্রাপ্তির IEnumerable<T>চেয়ে সরবরাহের চেয়ে IEnumerable<T>দৃ stronger় প্রতিশ্রুতি দরকার । কল করার ToListফলে IEnumerable<T>এমন প্রতিশ্রুতি রক্ষা পাওয়া যায় তবে অনেক ক্ষেত্রে অকারণে ব্যয়বহুল হয়। আমি পোস্ট করব যে সেখানে থাকা উচিত ...
সুপারক্যাট

... এমন একটি মাধ্যম যার মাধ্যমে কোড গ্রহণ করা প্রয়োজন হলেIEnumerable<T> বিষয়বস্তুগুলির একটি অনুলিপি তৈরি করতে পারে তবে অযথা এটি করা থেকে বিরত থাকতে পারে।
সুপারক্যাট

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

18

ফরচ লুপগুলি ভেরিয়েবলের সুযোগ!

var l = new List<Func<string>>();
var strings = new[] { "Lorem" , "ipsum", "dolor", "sit", "amet" };
foreach (var s in strings)
{
    l.Add(() => s);
}

foreach (var a in l)
    Console.WriteLine(a());

পাঁচটি "অ্যামেট" মুদ্রণ করে, যখন নিম্নলিখিত উদাহরণটি সূক্ষ্মভাবে কাজ করে

var l = new List<Func<string>>();
var strings = new[] { "Lorem" , "ipsum", "dolor", "sit", "amet" };
foreach (var s in strings)
{
    var t = s;
    l.Add(() => t);
}

foreach (var a in l)
    Console.WriteLine(a());

11
এটি অনামী পদ্ধতিগুলির সাথে মূলত জনের উদাহরণের সমতুল্য।
মেহরদাদ আফশারি

3
সংরক্ষণ করুন যে এটি ফোরচের সাথে আরও বিভ্রান্তিকর যেখানে "s" ভেরিয়েবল স্কোপড ভেরিয়েবলের সাথে মিশ্রিত করা আরও সহজ। সাধারণ-লুপগুলির সাথে সূচক ভেরিয়েবল স্পষ্টভাবে প্রতিটি পুনরাবৃত্তির জন্য একই।
মিক্কো রন্তানেন


2
এটি সি # 5 এ স্থির করা হয়েছিল ।
জনবট 12'15

আপনি মূলত একই পরিবর্তনশীলটি পরিবর্তন না করে বার বার মুদ্রণ করছেন।
জর্দান

18

এমএস এসকিউএল সার্ভার 1753 এর আগে তারিখগুলি পরিচালনা করতে পারে না ific উল্লেখযোগ্যভাবে, এটি .NET DateTime.MinDateধ্রুবকের সাথে সমলাপের বাইরে, যা 1/1/1। সুতরাং যদি আপনি কোনও মানসিকতা, একটি ত্রুটিযুক্ত তারিখ (যেমনটি সম্প্রতি একটি ডেটা আমদানিতে আমার সাথে ঘটেছিল) বা উইলিয়াম দ্য কনকারের জন্ম তারিখটি সংরক্ষণ করার চেষ্টা করেন তবে আপনি সমস্যায় পড়বেন। এর জন্য কোনও অন্তর্নির্মিত কাজ নেই; যদি আপনার 1753 এর আগে তারিখগুলি নিয়ে কাজ করার দরকার হয় তবে আপনার নিজের কাজের কথা লিখতে হবে।


17
মোটামুটিভাবে আমি মনে করি এমএস এসকিউএল সার্ভারের এই অধিকার আছে এবং। নেট ভুল। আপনি যদি গবেষণাটি করেন তবে আপনি জানেন যে 1751 পূর্বের তারিখগুলি ক্যালেন্ডার পরিবর্তনের কারণে পুরোপুরি বাদ যায় এমন দিন ইত্যাদির কারণে মজাদার হয়ে ওঠে etc. বেশিরভাগ আরডিবিএমগুলির কিছুটা কাট পয়েন্ট থাকে। এই আপনি একটি আদ্যস্থল দিতে হবে ancestry.com/learn/library/article.aspx?article=3358
NotMe

11
এছাড়াও, তারিখটি 1753 .. যা প্রথমবারের মতো ছিল যে আমাদের কাছে তারিখগুলি বাদ দেওয়া ছাড়া অবিচ্ছিন্ন ক্যালেন্ডার রয়েছে। এসকিউএল ২০০ the তারিখ এবং তারিখের সময় 2 তারিখের টাইপ চালু করেছে যা 1/1/01 থেকে 12/31/9999 তারিখগুলি গ্রহণ করতে পারে। তবে, যদি আপনি সত্যিই প্রাক-1753 তারিখের তুলনা করে থাকেন তবে এই ধরণের ব্যবহারের তারিখের তুলনা সন্দেহের সাথে দেখা উচিত।
নটমে

ওহ, ডান, 1753, সংশোধন, ধন্যবাদ।
শওল বহর

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

5
জুলিয়ান দিবসে উইকিপিডিয়াদের মাধ্যমে আপনি একটি ১৩ লাইন বেসিক প্রোগ্রাম CALJD.BAS পেতে পারেন যা 1984 সালে প্রকাশিত তারিখ গণনা করতে পারে 5000 খ্রিস্টপূর্বাব্দে, লিপ দিনগুলি এবং 1753 এ বাদ দেওয়া দিনগুলিকে বিবেচনা করে। তাই আমি কেন দেখছি না "আধুনিক "এসকিউএল ২০০৮ এর মতো সিস্টেমগুলির আরও খারাপ করা উচিত। আপনি 15 তম শতাব্দীতে সঠিক তারিখের উপস্থাপনে আগ্রহী নাও হতে পারেন, তবে অন্যরাও হতে পারে এবং আমাদের সফ্টওয়্যারটি বাগগুলি ছাড়াই এটি পরিচালনা করতে হবে। আর একটি ইস্যু লিপ সেকেন্ডের। । ।
রোল্যান্ড

18

কদর্য লিনক ক্যাচিং গোটচা

দেখুন আমার প্রশ্নের যে এই আবিষ্কারের নিয়ে গিয়ে ব্লগার যারা সমস্যা আবিষ্কার করেন।

সংক্ষেপে, ডেটা কনটেক্সট আপনি যে সমস্ত লিঙ্ক-টু-এসকিএল ভার্চু করেছেন সেগুলির একটি ক্যাশে রাখে। আপনি পূর্বে লোড করা রেকর্ডে অন্য কেউ যদি কোনও পরিবর্তন করেন তবে আপনি রেকর্ডটি পুনরায় লোড করলেও আপনি সর্বশেষতম ডেটা পেতে সক্ষম হবেন না !

এটি ObjectTrackingEnabledডেটা কন্টেক্সটে কল করা কোনও সংস্থার কারণে, যা পূর্বনির্ধারিতভাবে সত্য। আপনি মিথ্যাতে যে সম্পত্তি সেট করেন তাহলে, রেকর্ড নতুনভাবে প্রত্যেক সময় লোড হবে ... কিন্তু ... আপনি SubmitChanges সঙ্গে যে রেকর্ড কোনো পরিবর্তন জিদ করতে পারবে না ()।

Gotcha!


আইভি এই বিইউজি তাড়া করতে পেরে সবে মাত্র দেড়দিন (এবং চুলের বোঝা!) কাটিয়েছে ...
সার্জিক কোডার

এটাকে একটি সমঝোতা দ্বন্দ্ব বলা হয় এবং এটিকে কিছুটা ভারী হাতে নিয়ে যাওয়ার প্রবণতা রয়েছে যদিও এখন এগুলির কয়েকটি নির্দিষ্ট উপায় রয়েছে যদিও এটি এখনও একটি গোটচা। ডেটা কনটেক্সট একটি দুঃস্বপ্ন ছিল। ও_ও
জর্ডান

17

স্ট্রিম.রেডের চুক্তি এমন একটি জিনিস যা আমি প্রচুর লোককে ট্রিপ আপ করতে দেখেছি:

// Read 8 bytes and turn them into a ulong
byte[] data = new byte[8];
stream.Read(data, 0, 8); // <-- WRONG!
ulong data = BitConverter.ToUInt64(data);

এটি ভুল হওয়ার কারণটি হ'ল সর্বাধিক নির্দিষ্ট সংখ্যক বাইটগুলি Stream.Readপড়তে হবে তবে সম্পূর্ণ নিখরচায় মাত্র 1 বাইট পড়তে, এমনকি যদি অন্য 7 বাইট প্রবাহ শেষ হওয়ার আগে পাওয়া যায়।

এটা তোলে সাহায্য না যাতে অনুরূপ এই সৌন্দর্য Stream.Writeযা হয় নিশ্চিত সব বাইট লিখেছি যদি এটা কোন ব্যতিক্রম ফেরৎ। উপরের কোডটি প্রায় সব সময় কাজ করে এমনটিও সহায়তা করে না । এবং অবশ্যই এটি ঠিক তেমন এন বাইটস সঠিকভাবে পড়ার জন্য কোনও রেডিমেড, সুবিধাজনক পদ্ধতি নেই বলে সহায়তা করে না।

সুতরাং, গর্তটি প্লাগ করতে, এবং এটি সম্পর্কে সচেতনতা বাড়াতে, এখানে এটি করার সঠিক পদ্ধতির একটি উদাহরণ:

    /// <summary>
    /// Attempts to fill the buffer with the specified number of bytes from the
    /// stream. If there are fewer bytes left in the stream than requested then
    /// all available bytes will be read into the buffer.
    /// </summary>
    /// <param name="stream">Stream to read from.</param>
    /// <param name="buffer">Buffer to write the bytes to.</param>
    /// <param name="offset">Offset at which to write the first byte read from
    ///                      the stream.</param>
    /// <param name="length">Number of bytes to read from the stream.</param>
    /// <returns>Number of bytes read from the stream into buffer. This may be
    ///          less than requested, but only if the stream ended before the
    ///          required number of bytes were read.</returns>
    public static int FillBuffer(this Stream stream,
                                 byte[] buffer, int offset, int length)
    {
        int totalRead = 0;
        while (length > 0)
        {
            var read = stream.Read(buffer, offset, length);
            if (read == 0)
                return totalRead;
            offset += read;
            length -= read;
            totalRead += read;
        }
        return totalRead;
    }

    /// <summary>
    /// Attempts to read the specified number of bytes from the stream. If
    /// there are fewer bytes left before the end of the stream, a shorter
    /// (possibly empty) array is returned.
    /// </summary>
    /// <param name="stream">Stream to read from.</param>
    /// <param name="length">Number of bytes to read from the stream.</param>
    public static byte[] Read(this Stream stream, int length)
    {
        byte[] buf = new byte[length];
        int read = stream.FillBuffer(buf, 0, length);
        if (read < length)
            Array.Resize(ref buf, read);
        return buf;
    }

1
অথবা, আপনার স্পষ্ট উদাহরণে: var r = new BinaryReader(stream); ulong data = r.ReadUInt64();। বাইনারিআডার এরও একটি FillBufferপদ্ধতি রয়েছে ...
জিম্বোবমগজি

15

ঘটনাবলী

আমি কখনই বুঝতে পারি না কেন ঘটনাগুলি ভাষার বৈশিষ্ট্য। এগুলি ব্যবহারে জটিল: কল করার আগে আপনাকে নাল পরীক্ষা করতে হবে, আপনাকে (নিজেকে) নিবন্ধভুক্ত করা দরকার, কে নিবন্ধিত তা খুঁজে পেতে পারেন না (যেমন: আমি নিবন্ধন করেছি?)। কেন একটি ইভেন্ট লাইব্রেরিতে একটি ক্লাস হয় না? মূলত একজন বিশেষজ্ঞ List<delegate>?


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

3
আমি নেট ইভেন্টগুলি বাস্তবায়ন অপছন্দ করি। ইভেন্ট সাবস্ক্রিপশনটি এমন কোনও পদ্ধতিতে কল করে সাবস্ক্রিপশন হ্যান্ডল করা উচিত যা সাবস্ক্রিপশন যুক্ত করে এবং একটি আইডিস্পোজেবল ফিরিয়ে দেয়, যখন ডিসপোজ করার পরে সাবস্ক্রিপশনটি মুছে ফেলা হবে। "অ্যাড" এবং "রিমুভ" পদ্ধতির সমন্বয়ে বিশেষ নির্মাণের প্রয়োজন নেই যার শব্দার্থবিজ্ঞান কিছুটা ডজ্বল হতে পারে, বিশেষত যদি কোনও মাল্টিকাস্ট ডেলিগেট যুক্ত করার চেষ্টা করে এবং পরে উদাহরণস্বরূপ "এবি" এর পরে "বি" যুক্ত করে, তবে সরান "বি" ("বিএ" ছেড়ে) এবং "এবি" (এখনও "বিএ" ছাড়ছে)
O ওফস

@ সুপের্যাট আপনি কীভাবে পুনরায় লিখবেন button.Click += (s, e) => { Console.WriteLine(s); }?
অর্ক-কুন

যদি আমি অন্য ইভেন্টগুলি থেকে আলাদাভাবে সদস্যতা ছাড়তে IEventSubscription clickSubscription = button.SubscribeClick((s,e)=>{Console.WriteLine(s);});এবং এর মাধ্যমে সদস্যতা ত্যাগ করতে সক্ষম হতে চাই clickSubscription.Dispose();। যদি আমার অবজেক্টটি সমস্ত সদস্যতা সারা জীবন জুড়ে রাখে MySubscriptions.Add(button.SubscribeClick((s,e)=>{Console.WriteLine(s);}));এবং তারপরে MySubscriptions.Dispose()সমস্ত সাবস্ক্রিপশনকে হত্যা করে।
সুপারক্যাট

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

14

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

class SomeGeneric<T>
{
    public static int i = 0;
}

class Test
{
    public static void main(string[] args)
    {
        SomeGeneric<int>.i = 5;
        SomeGeneric<string>.i = 10;
        Console.WriteLine(SomeGeneric<int>.i);
        Console.WriteLine(SomeGeneric<string>.i);
        Console.WriteLine(SomeGeneric<int>.i);
    }
}

এটি 5 10 ডলার প্রিন্ট করে


5
আপনার একটি জেনেরিক বেস শ্রেণি থাকতে পারে, যা স্ট্যাটিকগুলি সংজ্ঞায়িত করে এবং এর থেকে জেনেরিকদের উত্তরাধিকার সূত্রে গ্রহণ করে। যদিও আমি সি # তে এই আচরণের জন্য কখনই পড়ে যাইনি - এখনও কিছু সি ++ টেম্পলেটগুলির দীর্ঘ ডিবাগিং ঘন্টাগুলি মনে আছে ... Eww! :)
পলিয়াস

7
অদ্ভুত, আমি ভেবেছিলাম এটি সুস্পষ্ট ছিল। iটাইপটি থাকলে এটি কী করা উচিত তা ভেবে দেখুন T
টিমভি

1
টাইপ পরামিতি এর অংশ TypeSomeGeneric<int>এর থেকে আলাদা ধরন SomeGeneric<string>; অবশ্যই প্রত্যেকের নিজস্ব নিজস্ব রয়েছেpublic static int i
রাডারবব

13

একাধিকবার মূল্যায়ন করা যায়

যখন আপনার একটি অলস-গুণযুক্ত গণনা করা হবে এবং আপনি এটির উপরে বারবার পুনরাবৃত্তি করবেন এবং বিভিন্ন ফলাফল পান এটি আপনাকে দংশিত করবে। (বা আপনি একই ফলাফল পান তবে এটি অকারণে দুইবার কার্যকর করা হয়)

উদাহরণস্বরূপ, একটি নির্দিষ্ট পরীক্ষা লেখার সময় আমার যুক্তি পরীক্ষা করার জন্য কয়েকটি টেম্প ফাইলের প্রয়োজন ছিল:

var files = Enumerable.Range(0, 5)
    .Select(i => Path.GetTempFileName());

foreach (var file in files)
    File.WriteAllText(file, "HELLO WORLD!");

/* ... many lines of codes later ... */

foreach (var file in files)
    File.Delete(file);

আমার বিস্ময়ের কল্পনা যখন File.Delete(file)ছোঁড়ে FileNotFound!!

এখানে যা ঘটছে তা হল filesগণনার দ্বিগুণ পুনরাবৃত্তি হয়েছিল (প্রথম পুনরাবৃত্তির ফলাফলগুলি সহজভাবে হয় না মনে রাখা হয় ) এবং প্রতিটি নতুন পুনরাবৃত্তিতে আপনাকে পুনরায় কল করা হবে Path.GetTempFilename()যাতে আপনি আলাদা আলাদা টেম্প ফাইলের নাম পাবেন।

সমাধানটি অবশ্যই ব্যবহার ToArray()বা এর মাধ্যমে মূল্যকে আগ্রহী করে গণ্য করা ToList():

var files = Enumerable.Range(0, 5)
    .Select(i => Path.GetTempFileName())
    .ToArray();

আপনি যখন বহুতল থ্রেডযুক্ত কিছু করছেন তখন এটি আরও ভয়াবহ is

foreach (var file in files)
    content = content + File.ReadAllText(file);

এবং আপনি খুঁজে পেতে content.Length0 এখনও সব লেখার পরে !! তারপরে আপনি কঠোরভাবে পরীক্ষা করতে শুরু করেন যে যখন আপনার কোনও রেস শর্ত নেই তখন .... যখন এক সময় নষ্ট হওয়ার পরে ... আপনি বুঝতে পেরেছিলেন যে এটি কেবলমাত্র সেই ছোট্ট ছোট্ট অঙ্কের গোচা জিনিস যা আপনি ভুলে গেছেন ....


এটি নকশা দ্বারা। একে মুলতুবি কার্যকর বলা হয়। অন্যান্য জিনিসের মধ্যে এটি টিএসকিউএল কনস্ট্রাক্টসগুলি অনুকরণ করা বোঝায়। প্রতিবার আপনি যখন স্কয়ার ভিউ থেকে নির্বাচন করেন আপনি বিভিন্ন ফলাফল পান। এটি শৃঙ্খলার অনুমতি দেয় যা এসকিউএল সার্ভারের মতো দূরবর্তী ডেটা স্টোরগুলির জন্য সহায়ক। অন্যথায় x.Select.Where.OrderBy ডাটাবেসে 3 টি পৃথক কমান্ড প্রেরণ করত ...
as9876

@AYS আপনি প্রশ্নের শিরোনামে "গোটচা" শব্দটি মিস করেছেন?
চক্রত

আমি ভেবেছিলাম গেটছা বলতে ডিজাইনারদের তদারকি করা হয়েছে, উদ্দেশ্যমূলক কিছু নয়।
as9876

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

13

সবেমাত্র এমন এক অদ্ভুত সন্ধান পেয়েছি যা আমাকে কিছুক্ষণের জন্য ডিবাগে আটকে রেখেছিল:

আপনি একটি বাছাই ছাড়াই একটি মূল্য ছাড়ের জন্য নাল বৃদ্ধি করতে পারেন এবং মান শূন্য থাকে।

int? i = null;
i++; // I would have expected an exception but runs fine and stays as null

এটি সি # কীভাবে নালযোগ্য প্রকারের জন্য অপারেশন পরিচালনা করে তার ফলাফল। এটি আপনার কাছে নিক্ষেপ করা সমস্ত কিছুই এনএএন এর অনুরূপ।
IllidanS4

10
TextInfo textInfo = Thread.CurrentThread.CurrentCulture.TextInfo;

textInfo.ToTitleCase("hello world!"); //Returns "Hello World!"
textInfo.ToTitleCase("hElLo WoRld!"); //Returns "Hello World!"
textInfo.ToTitleCase("Hello World!"); //Returns "Hello World!"
textInfo.ToTitleCase("HELLO WORLD!"); //Returns "HELLO WORLD!"

হ্যাঁ, এই আচরণটি নথিভুক্ত, তবে এটি অবশ্যই এটি সঠিক করে না।


5
আমি একমত নই - যখন একটি শব্দ সমস্ত ক্যাপগুলিতে থাকে তখন এর বিশেষ অর্থ হতে পারে যে আপনি শিরোনাম কেসের সাথে গোলযোগ করতে চান না, যেমন "মার্কিন যুক্তরাষ্ট্রে রাষ্ট্রপতি" -> "আমেরিকার রাষ্ট্রপতি", "রাষ্ট্রপতি না" আমেরিকা".
শওল বেহর

5
@ শৌল: যে ক্ষেত্রে তাদের বিভ্রান্তি এড়াতে প্যারামিটার হিসাবে এটিকে নির্দিষ্ট করা উচিত , কারণ যে সময়ের আগে এই আচরণটি প্রত্যাশা করেছিল এমন কারও সাথে আমি কখনও সাক্ষাত করি নি - যা এটিকে গোচা করে তোলে !
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.