সি # আউট প্যারামিটারের কোনও ভিবি.এনইটি সমতুল্য?


95

VB.NET এর কি সি # outফাংশন প্যারামিটারের সাথে সরাসরি সমতুল্য রয়েছে , যেখানে কোনও ফাংশনে রূপান্তরিত ভেরিয়েবলটি আরম্ভ করার দরকার নেই?

উত্তর:


98

না, outভিবিতে কীওয়ার্ডের সমতুল্য নেই ।

যাইহোক, ভিবি কোনও পদ্ধতিতে সমস্ত স্থানীয় ভেরিয়েবল স্বয়ংক্রিয়ভাবে আরম্ভ করে, তাই আপনি ByRefপ্রথমে স্পষ্টভাবে ভেরিয়েবলটি আরম্ভ করার প্রয়োজন ছাড়াই ব্যবহার করতে পারেন ।

উদাহরণ:

Sub Main()
  Dim y As Integer
  Test(y)
End Sub

Sub Test(ByRef x As Integer)
  x = 42
End Sub

(যদি আপনি ফ্রেমওয়ার্কে কোড পরীক্ষা করেন (উদাহরণস্বরূপ Double.TryParse ), আপনি <OutAttribute>প্যারামিটারগুলিতে সংযোজন দেখতে পাচ্ছেন , তবে কেবলমাত্র COM ইন্টারপ বা প্ল্যাটফর্ম আহ্বানের জন্য কলটি মার্শাল করা হলে এটি কেবল তাত্পর্যপূর্ণ)


4
@ স্পোল্টো: আপনি যদি ভিবিএসক্রিপ্টকে ভিবিতে অনুবাদ করছেন, আপনার অবশ্যই স্পষ্ট এবং কঠোর মোড সেট করা নিশ্চিত করা উচিত। এটি আপনাকে আরও ত্রুটি বার্তাগুলি পেয়েছে, তবে বেশিরভাগই সমস্যার উত্সের দিকে নির্দেশ করবে (উদাহরণস্বরূপ প্রকরণ ছাড়াই ঘোষিত) (উদাহরণস্বরূপ ভেরিয়েবলটি প্রকার ছাড়াই ঘোষিত হয় Object, সুতরাং এটি কোনও ByRef x As Integerপ্যারামিটারের জন্য ব্যবহার করা যাবে না )।
গুফা

4
@ গুফা: আমি জানি না এটি কোনও সংস্করণের জিনিস কিনা তবে আমি পরামিতি হিসাবে অবিচ্ছিন্ন রেফারেন্স টাইপের ভেরিয়েবলগুলি পাস করার সময় সংকলক সতর্কতাও পাই ByRef। (এটি মান ধরণের পরামিতিগুলির সাথে ঘটে না))
ড্যান তাও

4
@ ড্যান টাও, স্পোল্টো: পার্থক্য বলে মনে হচ্ছে, আমি রেফারেন্সের ধরণের সাথে একটি সতর্কতাও পেয়েছি। পরামিতিগুলি নির্দিষ্ট করতে অক্ষমতা হ'ল ভাষার একটি সীমাবদ্ধতা এবং সতর্কতা থেকে মুক্তি পেতে আপনাকে কেবল পরিবর্তনগুলি শুরু করতে হবে। এমনকি Nothingতাদেরকে নির্ধারণ করা সতর্কতা ইভেন্ট থেকে মুক্তি পাবে যদিও ফলাফলটি পরিবর্তন করে না।
গুফা

4
@ গুফা: হ্যাঁ, আমি এতক্ষণ Nothingতাদেরকে দায়িত্ব দিয়ে আসছি । একটি বৃহত লিগ্যাসির ওয়েবসাইটে শত শত বার এটি করতে হওয়ায় এটি কেবল সময়সাপেক্ষ। তদন্ত করার জন্য আপনাকে ধন্যবাদ।
সিএসপল্টন

4
@ মার্কহর্ড: তারপরে ডাউনভোটটি অন্যায্য, কারণ আমি ইতিমধ্যে coveredেকে রেখেছি যে Outগুণটি সি # কীওয়ার্ডের সমতুল্য নয়out
গুফা

32

না, আর কোন সমতুল্য কনস্ট্রাক্ট একটি অ-ইনিশিয়ালাইজ পরিবর্তনশীল একটি সতর্কবাণী ছাড়াই একটি পদ্ধতি এ পাস করার অনুমতি দেয় হিসাবে আমার উল্লেখ করা হয়, কিন্তু, প্রশ্ন ও উত্তর একটি নির্দিষ্ট <Out()>বৈশিষ্ট্য একটি উপর ByRef, প্যারামিটার সংজ্ঞা যদিও ভিবি এটা উপেক্ষা করে, হয় সি # দ্বারা চিকিত্সা outপ্যারামিটার হিসাবে

তাই, আমি প্রাক ইনিশিয়ালাইজ করবে রেফারেন্স ভেরিয়েবল Nothing এবং উল্লেখ<Out()> ByRef অভিপ্রায়টি করতে করব (এটি যদি সি # ব্যবহারকারীরা কখনও আপনার পদ্ধতিতে অ্যাক্সেস করে তবে কাজ করবে)।

আপনি যদি মনে করেন আপনি কি জানেন যখন আপনি ডিফল্ট অ্যাক্সেস করতে মনস্থ করা Nothingঅন্যথায় নিয়োগমুক্র রেফারেন্স ভেরিয়েবলের মধ্যে আপনি "সতর্কতা কনফিগারেশন" সেট করতে পারেন "ব্যবহারের পরিবর্তনশীল" নির্ধারণ করার আগে থেকে কোনটি "" সম্ভবত প্রকল্প স্তর (প্রোজেক্ট বিশিষ্টতার> কম্পাইল, এবং আপনি এই সেটিংটি পরিবর্তন করার আগে কনফিগারেশনকে "সমস্ত কনফিগারেশনগুলিতে" সেট করতে চান), বা, ভিএস ২০১৫ (ভিবি। নেট ১৪) এ আপনি ব্যবহার করতে পারেন #Disable Warning BC42030


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

@ রিচার্ড কললেট এটাই সম্ভবত আমার লিঙ্কিত প্রশ্নের উত্তর হতে পারা!
মার্ক হার্ট

9

সি # সংস্করণ

  void TestFunc(int x, ref int y, out int z) {
  x++;  
  y++;
  z = 5;
}

Vb.net সংস্করণ

    Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
  x += 1
  y += 1 
  z = 5 
End Sub

উত্তরটি এখানে পেয়েছি

হালনাগাদ

মন্তব্যে বর্ণিত হিসাবে আপনার পরামিতিটি আরম্ভ করতে ভুলবেন না যা আউট স্লটে ব্যবহৃত হবে


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

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

1

আমার ভিবি.এনইটি-তে সমস্যা ছিল যে আমি একটি ফাংশনকে "বাই রেফ" বলেছিলাম যা একটি অ্যারে পিছিয়ে গেছে।

যদিও সংকলকটি এটি সতর্কবার্তা হিসাবে পতাকাঙ্কিত করেছে এটি ঠিক ছিল। ফিক্সটি অত্যন্ত সাধারণ এবং সম্ভবত ভাল প্রোগ্রামিং অনুশীলন।

আমি বদলে গেছি

Dim m_arr_values() as Integer

fnRetArray(m_arr_values)

প্রতি

' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing

fnRetArray(m_arr_values)

ভেরিয়েবলের নাম বর্ণনামূলক হলে কোডিং করার সময়ও এটি সহায়তা করে ...

Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
    ...
End Sub

4
হাঙ্গেরিয়ান স্বীকৃতি .NET ফ্রেমওয়ার্ক ডিজাইনের গাইডলাইনটির বিরুদ্ধে।
Gqqnbig

0

আপনি ভিবি.এনইটি-তে পাস বাই রেফারেন্স পদ্ধতি ব্যবহার করতে পারেন।

আপনার সি # তে আউট প্যারামিটার প্রক্রিয়া দরকার কারণ এটি আপনাকে কোনও পরিবর্তনশীল আরম্ভ না করে ব্যবহার করতে দেয় না।

VB.NET এর কোনও বিশেষ কীওয়ার্ডের প্রয়োজন নেই কারণ এটি স্বয়ংক্রিয়ভাবে এটি নিজেই করে।

কেবলমাত্র বাইআরফ ব্যবহার করুন।


4
এটি প্রশ্নের উত্তর দেয় না, এবং সি # এর সাথে এটি ভুল।
সিএসপল্টন

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

0

ভিবিতে বৈশিষ্ট্য রয়েছে যা সি # আউট হিসাবে সমান হওয়া উচিত তবে আজও আপনি এটি ব্যবহার করা সত্বেও একটি সতর্কতা পান। গিথুবের vblang এটিকে ঠিক করার বিষয়ে বিশদ রয়েছে। https://github.com/dotnet/vblang/issues/67


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