ভিজ্যুয়াল স্টুডিও ডিবাগিং "দ্রুত ঘড়ি" সরঞ্জাম এবং ল্যাম্বদা এক্সপ্রেশন


96

"কুইক ওয়াচ" উইন্ডোতে ডিবাগ করার সময় আমি কেন ল্যাম্বদা এক্সপ্রেশন ব্যবহার করতে পারি না?

ইউপিডি: এটিও দেখুন

http://blogs.msdn.com/b/jaredpar/archive/2009/08/26/why-no-linq-in-debugger-windows.aspx

http://blogs.msdn.com/b/jaredpar/archive/2010/06/02/why-is-linq-abmitted-from-debugger-windows-part-2.aspx


4
এটি সম্পন্ন হয়েছে এবং ভিএস 2015 এর পূর্বরূপে উপলব্ধ। ভিজ্যুষ্টুডিও.ইউসারওয়াইজ
ফ্রান্সিসকো


লাম্বদা অভিব্যক্তির জন্য আমি এমএসডিএন-তে দেওয়া খুব সাধারণ উদাহরণ চেষ্টা করেছি কিন্তু এটি কার্যকর হয় না। আমার ভিএস 2015 এন্টারপ্রাইজ সংস্করণ রয়েছে
8.02

4
@ Franciscod'Anconia ডিবাগ মধ্যে ল্যামডা সমর্থন সক্ষম করতে, "ব্যবহারের পরিচালিত সামঞ্জস্যতা মোড" বন্ধ (চেক করা হয়েছে stackoverflow.com/a/36559817/818321 ) একটি ফলস্বরূপ, আপনি শর্তসাপেক্ষ ব্রেকপয়েন্ট ব্যবহার করতে পারবেন না: blogs.msdn .microsoft.com / devops / 2013/10/16 /… এবং stackoverflow.com/a/35983978/818321
নিক

উত্তর:


64

বেনাম পদ্ধতিগুলির মতো লাম্বদা এক্সপ্রেশনগুলি আসলে খুব জটিল জন্তু। এমনকি আমরা যদি Expression(.NET 3.5) থেকে বঞ্চিত হয় তবে এটি এখনও অনেক কিছু ফেলে যায় জটিলতা ফেলে দেয়, কমপক্ষে ভেরিয়েবলকে বন্দী করা হয় না, যা মূলত তাদের কোডগুলি পুনরায় গঠন করে যা তাদের ব্যবহার করে (ভেরিয়েবল হিসাবে আপনি কী মনে করেন সংকলক-উত্পন্ন শ্রেণিতে ক্ষেত্র হয়ে ওঠে) , ধূমপান এবং আয়না একটি বিট সঙ্গে।

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


91

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

বেশিরভাগ লোকেরা ডিবাগারে একটি বেনামী ফাংশন সম্পাদন করে যা বিবেচনা করে না তা হ'ল এটি কোনও ভ্যাকুয়ামে ঘটে না। একটি অনামী ফাংশন সংজ্ঞায়িত এবং পরিচালনা করার খুব কার্যটি কোড বেসের অন্তর্নিহিত কাঠামোকে পরিবর্তন করে। কোডটি সাধারণভাবে এবং বিশেষত তাত্ক্ষণিক উইন্ডো থেকে পরিবর্তন করা একটি খুব কঠিন কাজ 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


41
হুইন, হুইন, মিডিয়াক্রিটি, হুইন, হুইন মেনে। ডিবাগারটি আইডিইর হৃদয় এবং আপনি এটি ভেঙে ফেলেছেন! ওয়াচ উইন্ডোতে ল্যাম্বডাসকে কিছু ক্যাপচার করার দরকার নেই। অন্য যে কোনও ঘড়ির কোডের মতো, তারা কেবল নির্দিষ্ট স্ট্যাক ফ্রেমেই বোঝায়। (বা অন্যথায় আপনি ভেরিয়েবলটি ক্যাপচার করেন, একই ভেরিয়েবল নামের সাথে অন্য কোনও ফাংশনে যান ... এবং কী?) ডিবাগারটি কম্পাইলারের চারপাশে হ্যাক করা বোঝায়। এটাকে সফল কর!
আলেকসান্দ্র ডাবিনস্কি

4
এগুলি কেন সহজ করে ঘড়ির উইন্ডোতে ল্যাম্বডাসে ক্যাপচার করা ভেরিয়েবলগুলিকে অনুমতি দেয় না। সহজ এবং লম্বডাসকে সত্যিকারের কার্যকরী কোডে ব্যবহৃত হচ্ছে এমন একগুচ্ছ ডিবাগ দৃশ্যের অনুমতি দেয়।
লুইজ ফিলিপ

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

4
@ জারেদপার আপনি ব্লগ পোস্ট মার্কের কথা বলতে পারলে শেয়ার করতে পারেন
এহসান সাজ্জাদ

49

আপনি তাত্ক্ষণিক বা ওয়াচ উইন্ডোতে ল্যাম্বডা এক্সপ্রেশন ব্যবহার করতে পারবেন না।

তবে আপনি সিস্টেম.লিনক.ডায়নামিক এক্সপ্রেশনগুলি ব্যবহার করতে পারেন যা রূপটি গ্রহণ করে W যেখানে ("আইডি = @ 0", 2) - এটিতে স্ট্যান্ডার্ড লিন্কে সম্পূর্ণ পদ্ধতি উপলব্ধ নেই এবং সম্পূর্ণরূপে নেই ল্যাম্বদা এক্সপ্রেশন শক্তি, কিন্তু এখনও, এটি কিছুই চেয়ে ভাল!


4
ঠিক আছে ... অন্যরা এটি সম্ভব না হওয়ার পরে ব্যাখ্যা করেছিল, এটি অন্তত আমাদের একটি সম্ভাব্য সমাধান সরবরাহ করে। +1
নুলিয়াস

4
কেবল স্পষ্ট করে বলতে গেলে, আপনি "ইম্পোর্ট সিস্টেম.লিনক.ডায়নামিক" এবং তারপরে ডিবাগ উইন্ডোতে আপনি "" কোথায় (কিছু.আসকিউয়েবল, "সম্পত্তি> জাইজ", কিছুই নেই) লিখেছেন '
স্মার্কিংম্যান

এটা অসাধারণ. যদিও আপনি যেমন Linq এক্সটেনশন পদ্ধতি সম্পূর্ণ পরিসর, কোন না পেতে পারি .Any(string predicate), আপনি করতে পারেন : ভালো কিছু করা .Where("Id>2").Any()ওয়াচ উইন্ডো, অথবা উৎসে পিন হবে। এটা দুর্দান্ত!
রক্ষক এক

22

ভবিষ্যত এসে গেছে!

ল্যাম্বডা এক্সপ্রেশন ডিবাগ করার জন্য সমর্থন ভিজ্যুয়াল স্টুডিও 2015 ( লেখার সময় পূর্বরূপ ) এ যুক্ত করা হয়েছে।

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


এটা দেখতে সুন্দর। কুল ...!
রাহুল নিকতে


5

এটি সাহায্য করতে পারে: ভিজ্যুয়াল স্টুডিওর জন্য বর্ধিত তাত্ক্ষণিক উইন্ডো (ডিবাগিংয়ে লিনক, ল্যাম্বডা এক্সপ্রেস ব্যবহার করুন)

সব ভাল, প্যাট্রিক


4
মনে রাখবেন যে প্রথম লিঙ্কটি দুর্দান্ত দেখায়, এটি আলফায় রয়েছে এবং এর থেকে বেরিয়ে আসার সম্ভাবনা নেই (সর্বশেষ ২০০৮ সালে আপডেট হয়েছিল)।
জন সালভাটিয়ার

2

লাম্বডা এক্সপ্রেশনগুলি ডিবাগারের অভিব্যক্তি মূল্যায়নকারীর দ্বারা সমর্থিত নয় ... যা কমপাইল করার সময় অভিব্যক্তির পরিবর্তে পদ্ধতিগুলি (বা এক্সপ্রেশন ট্রি) তৈরি করতে ব্যবহৃত হয় বলে খুব কমই আশ্চর্য হয় (ডিসপ্লেতে .NET 2 এ স্যুইচ করা প্রতিবিম্বকে দেখে নিন) তাদের দেখ).

অবশ্যই তারা একটি বন্ধন গঠন করতে পারে, কাঠামোর আরও একটি পুরো স্তর।


ঠিক আছে, তারা পদ্ধতি তৈরি করতে পারে ; তারা Expressionগাছ তৈরি করতে পারে - এটি প্রসঙ্গে নির্ভর করে।
মার্ক গ্র্যাভেল

1

ভিএস 2015 এ আপনি এখন এটি করতে পারেন, তারা যুক্ত হওয়া নতুন বৈশিষ্ট্যগুলির মধ্যে এটি একটি।


1

আপনার যদি এখনও ভিজ্যুয়াল স্টুডিও 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 }

ধারণার জন্য লেখক এখানে পাওয়া যাবে


1

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

ডিবাগ করার সময় ল্যাম্বদা এক্সপ্রেশনগুলির মূল্যায়নের অনুমতি দিন

আপনি সেখানে থাকাকালীন আপনার ভোট যুক্ত করুন!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.