"কুইক ওয়াচ" উইন্ডোতে ডিবাগ করার সময় আমি কেন ল্যাম্বদা এক্সপ্রেশন ব্যবহার করতে পারি না?
ইউপিডি: এটিও দেখুন
http://blogs.msdn.com/b/jaredpar/archive/2009/08/26/why-no-linq-in-debugger-windows.aspx
"কুইক ওয়াচ" উইন্ডোতে ডিবাগ করার সময় আমি কেন ল্যাম্বদা এক্সপ্রেশন ব্যবহার করতে পারি না?
ইউপিডি: এটিও দেখুন
http://blogs.msdn.com/b/jaredpar/archive/2009/08/26/why-no-linq-in-debugger-windows.aspx
উত্তর:
বেনাম পদ্ধতিগুলির মতো লাম্বদা এক্সপ্রেশনগুলি আসলে খুব জটিল জন্তু। এমনকি আমরা যদি Expression(.NET 3.5) থেকে বঞ্চিত হয় তবে এটি এখনও অনেক কিছু ফেলে যায় জটিলতা ফেলে দেয়, কমপক্ষে ভেরিয়েবলকে বন্দী করা হয় না, যা মূলত তাদের কোডগুলি পুনরায় গঠন করে যা তাদের ব্যবহার করে (ভেরিয়েবল হিসাবে আপনি কী মনে করেন সংকলক-উত্পন্ন শ্রেণিতে ক্ষেত্র হয়ে ওঠে) , ধূমপান এবং আয়না একটি বিট সঙ্গে।
এই হিসাবে, আমি কমপক্ষে বিস্মিত হইনি যে আপনি এগুলি অলসভাবে ব্যবহার করতে পারবেন না - প্রচুর সংকলক কাজ রয়েছে (এবং পর্দার পিছনে প্রজন্ম টাইপ করুন) যা এই যাদুটিকে সমর্থন করে।
না আপনি ঘড়ি / স্থানীয় / তাত্ক্ষণিক উইন্ডোতে ল্যাম্বডা এক্সপ্রেশন ব্যবহার করতে পারবেন না। যেমন মার্ক চিহ্নিত করেছেন এটি অবিশ্বাস্যরকম জটিল। যদিও আমি বিষয়টিতে আরও কিছুটা ডুব দিতে চেয়েছিলাম।
বেশিরভাগ লোকেরা ডিবাগারে একটি বেনামী ফাংশন সম্পাদন করে যা বিবেচনা করে না তা হ'ল এটি কোনও ভ্যাকুয়ামে ঘটে না। একটি অনামী ফাংশন সংজ্ঞায়িত এবং পরিচালনা করার খুব কার্যটি কোড বেসের অন্তর্নিহিত কাঠামোকে পরিবর্তন করে। কোডটি সাধারণভাবে এবং বিশেষত তাত্ক্ষণিক উইন্ডো থেকে পরিবর্তন করা একটি খুব কঠিন কাজ is
নিম্নলিখিত কোড বিবেচনা করুন।
void Example() {
var v1 = 42;
var v2 = 56;
Func<int> func1 = () => v1;
System.Diagnostics.Debugger.Break();
var v3 = v1 + v2;
}
এই নির্দিষ্ট কোডটি মান v1 ক্যাপচার করার জন্য একটি একক ক্লোজার তৈরি করে। বেনাম ক্যাপচার প্রয়োজন যখনই কোনও বেনাম ফাংশন তার সুযোগের বাইরে ঘোষণা করা একটি চলক ব্যবহার করে। সমস্ত অভিপ্রায় এবং উদ্দেশ্যে এই ফাংশনে v1 আর বিদ্যমান নেই। শেষ লাইনটি আরও নীচের মত দেখাচ্ছে
var v3 = closure1.v1 + v2;
যদি ফাংশন উদাহরণটি ডিবাগারে চালিত হয় তবে এটি ব্রেক লাইনে থামবে। এখন ভাবুন যদি ব্যবহারকারীটি ওয়াচ উইন্ডোতে নিম্নলিখিতটি টাইপ করে থাকে
(Func<int>)(() => v2);
এটি সঠিকভাবে কার্যকর করার জন্য ডিবাগারটি (বা আরও উপযুক্ত EE) ভেরিয়েবল v2 এর জন্য একটি ক্লোজার তৈরি করতে হবে। এটি করা কঠিন তবে অসম্ভব নয়।
যা সত্যিই এটি ইইয়ের পক্ষে একটি কঠিন কাজ করে তোলে তা হ'ল এটিই শেষ লাইন। কীভাবে এখন এই লাইনটি কার্যকর করা উচিত? সমস্ত উদ্দেশ্য এবং উদ্দেশ্যে বেনামে ফাংশনটি ভি 2 ভেরিয়েবল মুছে ফেলে এবং ক্লোজার 2.v2 দিয়ে প্রতিস্থাপন করেছে। সুতরাং কোডের শেষ লাইনটি এখনই পড়তে হবে
var v3 = closure1.v1 + closure2.v2;
তবুও কোডটিতে আসলে এই প্রভাব পেতে EE এর কোডের শেষ লাইনটি পরিবর্তন করতে হবে যা আসলে একটি ENC ক্রিয়া। যদিও এই নির্দিষ্ট উদাহরণটি সম্ভব, দৃশ্যের একটি ভাল অংশ নেই।
সবচেয়ে খারাপটি হ'ল ল্যাম্বডা এক্সপ্রেশনটি একটি নতুন বন্ধকরণ তৈরি করা উচিত নয় exec এটি প্রকৃত ক্লোজারে ডেটা যুক্ত করা উচিত। এই মুহুর্তে আপনি সরাসরি সীমাবদ্ধতা ENC এ চালান।
আমার ছোট্ট উদাহরণটি দুর্ভাগ্যক্রমে কেবল আমাদের যে সমস্যার মধ্যে চলছে সেগুলির পৃষ্ঠকে স্ক্র্যাচ করে। আমি বলছি আমি এই বিষয়ে একটি সম্পূর্ণ ব্লগ পোস্ট লিখব এবং আশা করি এই সপ্তাহান্তে আমার সময় হবে time
আপনি তাত্ক্ষণিক বা ওয়াচ উইন্ডোতে ল্যাম্বডা এক্সপ্রেশন ব্যবহার করতে পারবেন না।
তবে আপনি সিস্টেম.লিনক.ডায়নামিক এক্সপ্রেশনগুলি ব্যবহার করতে পারেন যা রূপটি গ্রহণ করে W যেখানে ("আইডি = @ 0", 2) - এটিতে স্ট্যান্ডার্ড লিন্কে সম্পূর্ণ পদ্ধতি উপলব্ধ নেই এবং সম্পূর্ণরূপে নেই ল্যাম্বদা এক্সপ্রেশন শক্তি, কিন্তু এখনও, এটি কিছুই চেয়ে ভাল!
.Any(string predicate), আপনি করতে পারেন : ভালো কিছু করা .Where("Id>2").Any()ওয়াচ উইন্ডো, অথবা উৎসে পিন হবে। এটা দুর্দান্ত!
ভবিষ্যত এসে গেছে!
ল্যাম্বডা এক্সপ্রেশন ডিবাগ করার জন্য সমর্থন ভিজ্যুয়াল স্টুডিও 2015 ( লেখার সময় পূর্বরূপ ) এ যুক্ত করা হয়েছে।
এক্সপ্রেশন মূল্যায়নকারীটি আবার লিখতে হয়েছিল, অনেকগুলি বৈশিষ্ট্য অনুপস্থিত: রিমোট ডিবাগিং এএসপি.এনইটি, তাত্ক্ষণিক উইন্ডোতে ভেরিয়েবলগুলি ঘোষণা করা, গতিশীল ভেরিয়েবলগুলি পরিদর্শন করা ইত্যাদি এছাড়াও ল্যাম্বডা এক্সপ্রেশনগুলির জন্য যা স্থানীয় ফাংশনে কল প্রয়োজন তা বর্তমানে সমর্থিত নয়।
এটি সাহায্য করতে পারে: ভিজ্যুয়াল স্টুডিওর জন্য বর্ধিত তাত্ক্ষণিক উইন্ডো (ডিবাগিংয়ে লিনক, ল্যাম্বডা এক্সপ্রেস ব্যবহার করুন)
সব ভাল, প্যাট্রিক
লাম্বডা এক্সপ্রেশনগুলি ডিবাগারের অভিব্যক্তি মূল্যায়নকারীর দ্বারা সমর্থিত নয় ... যা কমপাইল করার সময় অভিব্যক্তির পরিবর্তে পদ্ধতিগুলি (বা এক্সপ্রেশন ট্রি) তৈরি করতে ব্যবহৃত হয় বলে খুব কমই আশ্চর্য হয় (ডিসপ্লেতে .NET 2 এ স্যুইচ করা প্রতিবিম্বকে দেখে নিন) তাদের দেখ).
অবশ্যই তারা একটি বন্ধন গঠন করতে পারে, কাঠামোর আরও একটি পুরো স্তর।
Expressionগাছ তৈরি করতে পারে - এটি প্রসঙ্গে নির্ভর করে।
ভিএস 2015 এ আপনি এখন এটি করতে পারেন, তারা যুক্ত হওয়া নতুন বৈশিষ্ট্যগুলির মধ্যে এটি একটি।
আপনার যদি এখনও ভিজ্যুয়াল স্টুডিও 2013 ব্যবহার করার প্রয়োজন হয় তবে আপনি প্যাকেজ ম্যানেজার কনসোল উইন্ডোটি ব্যবহার করে অবিলম্বে উইন্ডোতে লুপ বা ল্যাম্বডা এক্সপ্রেশন লিখতে পারেন। আমার ক্ষেত্রে, আমি ফাংশনটির শীর্ষে একটি তালিকা যুক্ত করেছি:
private void RemoveRoleHierarchy()
{
#if DEBUG
var departments = _unitOfWork.DepartmentRepository.GetAll().ToList();
var roleHierarchies = _unitOfWork.RoleHierarchyRepository.GetAll().ToList();
#endif
try
{
//RoleHierarchy
foreach (SchoolBo.RoleHierarchy item in _listSoRoleHierarchy.Where(r => r.BusinessKeyMatched == false))
_unitOfWork.RoleHierarchyRepository.Remove(item.Id);
_unitOfWork.Save();
}
catch (Exception e)
{
Debug.WriteLine(e.ToString());
throw;
}
}
যেখানে আমার GetAll()ফাংশন:
private DbSet<T> _dbSet;
public virtual IList<T> GetAll()
{
List<T> list;
IQueryable<T> dbQuery = _dbSet;
list = dbQuery
.ToList<T>();
return list;
}
এখানে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি, তাই আমি বিভিন্ন সংগ্রহস্থলের সমস্ত আইটেম মুদ্রণ করতে চেয়েছিলাম:
অভ্যন্তরীণ ধারণা The "ডিলিট বিবৃতিটি রেফারেন্সের বাধা conflic" এফকে_ডবো.ডেপটার_ডবো.রোল হাইয়ারচি_অরনিজেশনাল রোল আইড with "এর সাথে বিরোধিত। বিবৃতিটি সমাপ্ত করা হয়েছে ""। সিস্টেম.এক্সেপশন {সিস্টেম.ডাটা.এসএলএল ক্লায়েন্ট.সক্ল্যা এক্সেপশন}
তারপরে, তাত্ক্ষণিক উইন্ডোতে এটি সম্পাদন করে বিভাগের সংগ্রহস্থলে কতগুলি রেকর্ড রয়েছে তা আমি খুঁজেছি:
_unitOfWork.DepartmentRepository.GetAll().ToList().Count
যা 243 এ ফিরে এসেছিল।
সুতরাং, আপনি যদি প্যাকেজ ম্যানেজার কনসোলে নিম্নলিখিতটি সম্পাদন করেন তবে এটি সমস্ত আইটেম মুদ্রণ করে:
PM> for($i = 0; $i -lt 243; $i++) { $a = $dte.Debugger.GetExpression("departments[$i].OrgagnizationalRoleId"); Write-Host $a.Value $i }
আপনার প্রশ্নের উত্তর দিতে, আপনি কেন এটি করতে পারবেন না তার ভিজ্যুয়াল স্টুডিও প্রোগ্রাম ম্যানেজারের অফিশিয়াল ব্যাখ্যা এখানে। সংক্ষেপে, কারণ "এটি সত্যই সত্যই কঠিন" ভিএস-তে প্রয়োগ করা to তবে বৈশিষ্ট্যটি বর্তমানে চলছে (আগস্ট 2014-তে আপডেট হয়েছে)
ডিবাগ করার সময় ল্যাম্বদা এক্সপ্রেশনগুলির মূল্যায়নের অনুমতি দিন
আপনি সেখানে থাকাকালীন আপনার ভোট যুক্ত করুন!