எனது அகராதி செயல்பாடுகள் துவக்கத்தில் ஏன் தோல்வியடைகின்றன?
சி# இல் அகராதிகளுடன் பணிபுரிவது மதிப்புகளுக்கு விசைகளை வரைபடமாக்குவதற்கான ஒரு சக்திவாய்ந்த வழியாகும், ஆனால் செயல்பாடுகளை விசைகளாக சேமிக்க முயற்சிக்கும்போது என்ன நடக்கும்? நீங்கள் பயங்கரமான CS1950 கம்பைலர் பிழை ஐ சந்தித்திருந்தால், நீங்கள் தனியாக இல்லை! செயல்பாட்டு குறிப்புகளுடன் ஒரு அகராதியை நேரடியாக துவக்க முயற்சிக்கும்போது பல டெவலப்பர்கள் இந்த சிக்கலில் சிக்குகிறார்கள். .
பூலியன் திரும்பும் செயல்பாடுகளை தொடர்புடைய செய்திகளுடன் இணைக்க விரும்பும் ஒரு திட்டத்தை நீங்கள் உருவாக்குகிறீர்கள் என்று கற்பனை செய்து பாருங்கள். நீங்கள் ஒரு அகராதியை உருவாக்குகிறீர்கள்
இந்த நடத்தையைப் புரிந்துகொள்வது க்கு டைவிங் தேவைப்படுகிறது, சி# முறை குழு மாற்றங்களை எவ்வாறு கையாளுகிறது , குறிப்பாக செயல்பாட்டு குறிப்புகளை ஒதுக்கும்போது. சி# கட்டமைப்பாளர்கள் அல்லது முறைகளுக்குள் மறைமுகமான மாற்றத்தை அனுமதிக்கும்போது, இது துவக்கி இல் ஒரே மாற்றத்துடன் போராடுகிறது. இது ஆரம்ப மற்றும் அனுபவமுள்ள டெவலப்பர்களுக்கு குழப்பமானதாக இருக்கும்!
விளக்குவதற்கு, முறை குழுக்கள் மற்றும் வெளிப்படையான பிரதிநிதிகள் க்கு இடையில் சி# எவ்வாறு வேறுபடுகிறது என்பதைப் பற்றி சிந்தியுங்கள். ஒரு சமையல்காரருக்கு எவ்வாறு ஒரு தெளிவான செய்முறையை வழங்க வேண்டும் என்பது போலவே, சி# கம்பைலருக்கு தெளிவற்ற தன்மையைத் தீர்க்க வெளிப்படையான செயல்பாட்டு கையொப்பம் தேவை. படிப்படியாக இதை உடைப்போம்!
கட்டளை | பயன்பாட்டின் எடுத்துக்காட்டு |
---|---|
Func<T> | ஒரு அகராதியில் செயல்பாட்டுக் குறிப்புகளை சேமிக்கப் பயன்படும் T வகை மதிப்பைத் தரும் ஒரு முறையை இணைக்கும் ஒரு பிரதிநிதியைக் குறிக்கிறது. |
() => MethodName() | ஒரு முறையைத் தூண்டும் அநாமதேய லாம்ப்டா வெளிப்பாட்டை உருவாக்குகிறது. இது நேரடி முறை குழு மாற்றங்களைத் தடுக்கிறது, இது கம்பைலர் பிழைகளை ஏற்படுத்தும். |
delegate bool BoolFunc(); | செயல்பாட்டு கையொப்பங்களை வெளிப்படையாக பொருந்தக்கூடிய தனிப்பயன் பிரதிநிதி வகையை வரையறுக்கிறது, இது தெளிவின்மை இல்லாமல் அகராதிகளில் செயல்பாட்டு சேமிப்பகத்தை அனுமதிக்கிறது. |
Dictionary<Func<bool>, string> | ஒரு அகராதி சேமிக்கும் செயல்பாடு விசைகள் மற்றும் அவற்றுடன் தொடர்புடைய சரம் மதிப்புகள். |
Assert.AreEqual(expected, actual); | ஒரு செயல்பாட்டின் வருவாய் மதிப்பு எதிர்பார்த்த முடிவுடன் பொருந்துகிறது என்பதை சரிபார்க்க அலகு சோதனையில் பயன்படுத்தப்படுகிறது. |
[SetUp] | ஒவ்வொரு சோதனைக்கும் முன்னர் செயல்படுத்தப்பட வேண்டிய ஒரு முறையைக் குறிக்கும் ஒரு NUNIT சோதனை பண்பு, சோதனை சார்புகளைத் தொடங்க பயனுள்ளதாக இருக்கும். |
private static bool MethodName() => true; | சுருக்கமான சோதனைக்குரிய தர்க்கத்திற்கு பயனுள்ள பூலியன் மதிப்பை வழங்கும் ஒரு சிறிய முறையை வரையறுக்கிறது. |
FunctionDictionary[() => TestA()] | லாம்ப்டா செயல்பாட்டை ஒரு விசையாகப் பயன்படுத்தி அகராதியிலிருந்து ஒரு மதிப்பை மீட்டெடுப்பதற்கான முயற்சிகள், செயல்பாட்டு குறிப்புகள் அகராதி விசைகளாக எவ்வாறு செயல்படுகின்றன என்பதை நிரூபிக்கிறது. |
internal class Program | ஒரே சட்டசபைக்குள் அணுகக்கூடிய ஒரு வகுப்பைக் குறிக்கிறது, ஆனால் வெளிப்புறமாக அல்ல, இணைத்தல். |
சி# இல் செயல்பாட்டு அகராதிகளைப் புரிந்துகொள்வது
c# உடன் பணிபுரியும் போது, செயல்பாடுகளை ஒரு அகராதி க்குள் சேமிக்க வேண்டிய சூழ்நிலைகளை நீங்கள் சந்திக்கலாம். அவற்றின் நடத்தைகளுக்கு மாறும் வகையில் செயல்பாடுகளை மேப்பிங் செய்வதற்கு இது பயனுள்ளதாக இருக்கும். இருப்பினும், நீங்கள் முறை பெயர்களுடன் அகராதியை நேரடியாகத் தொடங்க முயற்சித்தால், முறை குழு மாற்று சிக்கல்கள் காரணமாக கம்பைலர் ஒரு பிழையை வீசுகிறது. முதல் எடுத்துக்காட்டில் இதுதான் நடக்கிறது, அங்கு ஒரு புல துவக்கத்தில் ஒரு அகராதியில் செயல்பாடுகள் சேர்க்கப்படுகின்றன, இது CS1950 க்கு வழிவகுக்கிறது. தீர்வு லாம்ப்டா வெளிப்பாடுகள் அல்லது வெளிப்படையான பிரதிநிதிகள் , இது செயல்பாட்டு குறிப்புகளை சரியாக வரையறுக்கிறது. .
கட்டமைப்பாளரின் முதல் வேலை தீர்வு முறை குழு மாற்றங்கள் அவை முறை உடல்களுக்குள் அனுமதிக்கப்படுகின்றன. c# ஒரு முறை நோக்கத்தில் பிரதிநிதிகளுக்கு மறைமுகமான மாற்றங்களை அனுமதிப்பதால், கட்டமைப்பாளருக்குள் உள்ள அகராதியை வரையறுப்பது சிக்கல்கள் இல்லாமல் செயல்படுகிறது. இந்த அணுகுமுறை பொதுவாக கட்டளை முறை செயலாக்கங்கள் அல்லது நிகழ்வு-உந்துதல் கட்டமைப்புகள் போன்ற டைனமிக் செயல்பாட்டு பணிகள் தேவைப்படும் காட்சிகளில் பயன்படுத்தப்படுகிறது.
மற்றொரு தீர்வு வெளிப்படையான பிரதிநிதி வகையைப் பயன்படுத்துவதை உள்ளடக்குகிறது . func ஐ நம்புவதற்கு பதிலாக
சரியான தன்மையை உறுதிப்படுத்த, நுனிட்டைப் பயன்படுத்தி அலகு சோதனை சேர்க்கப்பட்டது. செயல்பாட்டு மேப்பிங்ஸ் எதிர்பார்த்த சரம் மதிப்புகளைத் தருகிறது என்பதை சரிபார்க்க டெவலப்பர்கள் இது அனுமதிக்கிறது. நடைமுறையில், கால்பேக் செயல்பாடுகளை கையாளும் போது சோதனை செயல்பாட்டு அகராதிகள் அவசியம் அல்லது டைனமிக் செயல்படுத்தல் பாய்கிறது . வீடியோ கேம் உள்ளீட்டு அமைப்பு பற்றி சிந்தியுங்கள், அங்கு வெவ்வேறு விசை அச்சகங்கள் குறிப்பிட்ட செயல்களைத் தூண்டும். செயல்பாடுகளின் அகராதியைப் பயன்படுத்துதல் தர்க்கத்தை தூய்மையாகவும் அளவிடக்கூடியதாகவும் ஆக்குகிறது. .
சி# இல் செயல்பாடுகளை சேமிக்க அகராதிகளைப் பயன்படுத்துதல்
சி#இல் முறை குறிப்புகளைப் பயன்படுத்தி செயல்பாடு-சேமிப்பு அகராதியை செயல்படுத்துதல்.
using System;
using System.Collections.Generic;
namespace FuncDictionaryExample
{
internal class Program
{
private Dictionary<Func<bool>, string> FunctionDictionary;
Program()
{
FunctionDictionary = new Dictionary<Func<bool>, string>
{
{ () => TestA(), "Hello" },
{ () => TestB(), "Byebye" }
};
}
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
private bool TestA() => true;
private bool TestB() => false;
}
}
மாற்று அணுகுமுறை: வெளிப்படையான பிரதிநிதிகளைப் பயன்படுத்துதல்
தொகுப்பு பிழைகளைத் தவிர்ப்பதற்கு வெளிப்படையான பிரதிநிதி வேலையுடன் உகந்த அணுகுமுறை.
using System;
using System.Collections.Generic;
namespace FuncDictionaryExample
{
internal class Program
{
private delegate bool BoolFunc();
private Dictionary<BoolFunc, string> FunctionDictionary;
Program()
{
FunctionDictionary = new Dictionary<BoolFunc, string>
{
{ TestA, "Hello" },
{ TestB, "Byebye" }
};
}
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
private static bool TestA() => true;
private static bool TestB() => false;
}
}
தீர்வுகளை சரிபார்க்க அலகு சோதனை
செயல்பாட்டு அகராதியின் சரியான தன்மையை உறுதிப்படுத்த NUNIT ஐப் பயன்படுத்தி அலகு சோதனை.
using NUnit.Framework;
using System.Collections.Generic;
namespace FuncDictionaryTests
{
public class Tests
{
private Dictionary<Func<bool>, string> functionDictionary;
[SetUp]
public void Setup()
{
functionDictionary = new Dictionary<Func<bool>, string>
{
{ () => TestA(), "Hello" },
{ () => TestB(), "Byebye" }
};
}
[Test]
public void TestDictionaryContainsCorrectValues()
{
Assert.AreEqual("Hello", functionDictionary[() => TestA()]);
Assert.AreEqual("Byebye", functionDictionary[() => TestB()]);
}
private bool TestA() => true;
private bool TestB() => false;
}
}
சி# இல் செயல்பாட்டு அகராதி துவக்க சிக்கல்களைக் கடக்கிறது
சி# இல் செயல்பாட்டு அகராதிகளுடன் பணிபுரியும் போது கருத்தில் கொள்ள வேண்டிய மற்றொரு முக்கியமான அம்சம் அநாமதேய முறைகள் மற்றும் லாம்ப்டா வெளிப்பாடுகள் துவக்க பிழைகளைத் தீர்ப்பதில் பங்கு வகிக்கின்றன. ஒரு முறை பெயர் நேரடியாகப் பயன்படுத்தப்படும்போது, கம்பைலர் மறைமுக மாற்றங்களுடன் போராடுகிறது. இருப்பினும், ஒரு லாம்ப்டா வெளிப்பாடு க்குள் செயல்பாட்டை மடக்குவதன் மூலம் () => TestA(), முறை குறிப்பு சரியாக விளக்கப்படுவதை நாங்கள் உறுதிசெய்கிறோம். இந்த நுட்பம் பொதுவாக நிகழ்வு-உந்துதல் நிரலாக்க இல் பயன்படுத்தப்படுகிறது, அங்கு கால்பேக் செயல்பாடுகள் சேமித்து மாறும் வகையில் செயல்படுத்தப்பட வேண்டும்.
செயல்பாட்டு சேமிப்பகத்தை மிகவும் வலுவானதாக மாற்றுவதற்கு பிரதிநிதி வகைகளை மேம்படுத்துவது மற்றொரு சிறந்த நடைமுறை. ஃபங்க்
கடைசியாக, சேமிக்கப்பட்ட செயல்பாடுகள் மாநில ஒருமைப்பாட்டை பராமரிப்பதை உறுதி செய்வது மிக முக்கியம். ஒரு செயல்பாடு வெளிப்புற மாறிகள் அல்லது வகுப்பு உறுப்பினர்களைப் பொறுத்தது என்றால், ஒதுக்கப்படும்போது அவை சரியாகப் பிடிக்கப்படுவதை உறுதிசெய்க. பல-திரிக்கப்பட்ட பயன்பாடுகள் இல், முறையற்ற செயல்பாட்டு குறிப்புகள் இன நிலைமைகளுக்கு வழிவகுக்கும். த்ரெட்லோகல் ஸ்டோரேஜ் அல்லது மாறாத செயல்பாட்டு அளவுருக்களைப் பயன்படுத்துவது இந்த சிக்கல்களைத் தடுக்க உதவும். நிபந்தனைகளின் அடிப்படையில் செயல்படுத்த செயல்பாடுகளை மாறும் வகையில் ஒரு பணி திட்டமிடல் ஐ கற்பனை செய்து பாருங்கள் - செயல்திறன் செயல்பாடு சேமிப்பு மென்மையான மரணதண்டனை உறுதி செய்கிறது. .
சி# அகராதிகளில் செயல்பாடுகளை சேமிப்பது பற்றிய பொதுவான கேள்விகள்
- கம்பைலர் ஏன் CS1950 பிழையை வீசுகிறது?
- கம்பைலர் தோல்வியடைகிறது, ஏனெனில் அது ஒரு முறை குழுவை மறைமுகமாக மாற்ற முடியாது Func<bool> ஒரு புலம் துவக்கி. மாற்றம் ஒரு கட்டமைப்பாளர் போன்ற ஒரு முறைக்குள் செயல்படுகிறது.
- செயல்பாட்டு அகராதி துவக்க சிக்கல்களை நான் எவ்வாறு சரிசெய்வது?
- ஒரு லாம்ப்டா வெளிப்பாடு க்குள் செயல்பாட்டு குறிப்பை மடிக்கவும் () => TestA() சரியான மாற்றத்தை உறுதிப்படுத்த.
- ஃபங்க் <பூல்> க்கு பதிலாக தனிப்பயன் பிரதிநிதியைப் பயன்படுத்துவது சிறந்ததா?
- ஆம், போன்ற தனிப்பயன் பிரதிநிதியை வரையறுத்தல் delegate bool BoolFunc(); குறியீடு வாசிப்புத்திறனை மேம்படுத்தலாம் மற்றும் தெளிவற்ற தன்மையைக் குறைக்கலாம்.
- ஒரு அகராதிக்குள் அளவுருக்களுடன் செயல்பாடுகளை சேமிக்க முடியுமா?
- ஆம், பயன்படுத்தவும் Func<T, TResult> போன்ற அளவுரு செயல்பாடுகளுக்கு Func<int, bool> ஒரு முழு எண்ணை எடுத்து பூலியன் திருப்பித் தரும் செயல்பாடுகளை சேமிக்க.
- பல திரிக்கப்பட்ட பயன்பாடுகளில் செயல்பாட்டு ஒருமைப்பாட்டை எவ்வாறு உறுதிப்படுத்துவது?
- போன்ற நூல்-பாதுகாப்பான நுட்பங்களைப் பயன்படுத்தவும் ThreadLocal சேமிப்பு அல்லது மாறாத செயல்பாட்டு அளவுருக்கள் பந்தய நிலைமைகளைத் தவிர்க்க.
அகராதிகளில் மாஸ்டரிங் செயல்பாட்டு சேமிப்பு
சி# இல் அகராதி க்குள் செயல்பாடுகளை சேமிப்பது மறைமுகமான மாற்று விதிகள் காரணமாக தந்திரமானதாக இருக்கும், ஆனால் சரியான நுட்பங்கள் அதை அடையக்கூடியதாக இருக்கும். லாம்ப்டா வெளிப்பாடுகள் அல்லது வெளிப்படையான பிரதிநிதிகள் ஐப் பயன்படுத்தி, டெவலப்பர்கள் தொகுப்பு பிழைகளைத் தவிர்த்து, நெகிழ்வான செயல்பாட்டு வரைபடங்களை உருவாக்கலாம். இந்த அணுகுமுறை ஒரு பயன்பாட்டில் ரூட்டிங் கட்டளைகள் போன்ற மாறும் நடத்தை ஒதுக்கீட்டிற்கு நன்மை பயக்கும்.
எளிய செயல்பாட்டு சேமிப்பகத்திற்கு அப்பால், முறை குறிப்புகளைப் புரிந்துகொள்வது அளவிடக்கூடிய மற்றும் திறமையான தீர்வுகளை வடிவமைக்க உதவுகிறது. கட்டியெழுப்ப மாநில இயந்திரங்கள், நிகழ்வு கையாளுபவர்கள் அல்லது பணி திட்டமிடுபவர்கள் , சரியாக துவக்கப்பட்ட செயல்பாட்டு அகராதிகள் நம்பகமான செயலாக்கத்தை உறுதி செய்கின்றன. சிறந்த நடைமுறைகளைப் பயன்படுத்துவதன் மூலம், டெவலப்பர்கள் வலுவான, மறுபயன்பாட்டு மற்றும் பராமரிக்கக்கூடிய குறியீடு கட்டமைப்புகளை உருவாக்க முடியும். .
நம்பகமான ஆதாரங்கள் மற்றும் குறிப்புகள்
- அதிகாரப்பூர்வ மைக்ரோசாஃப்ட் ஆவணங்கள் FUNC பிரதிநிதிகள் சி#இல் அவர்களின் பயன்பாடு: மைக்ரோசாஃப்ட் டாக்ஸ் - ஃபங்க் பிரதிநிதி
- விளக்கம் முறை குழு மாற்றங்கள் சி#இல்: மைக்ரோசாஃப்ட் டாக்ஸ் - லாம்ப்டா வெளிப்பாடுகள்
- சிறந்த நடைமுறைகள் செயல்பாடுகளை சேமித்தல் ஒரு அகராதியில் மற்றும் பொதுவான ஆபத்துக்களைத் தவிர்ப்பது: ஸ்டாக் வழிதல் - ஒரு அகராதியில் செயல்பாடுகளை சேமித்தல்
- நடைமுறை எடுத்துக்காட்டுகள் மற்றும் நிஜ உலக பயன்பாடு பிரதிநிதிகள் மற்றும் செயல்பாட்டு வரைபடங்கள்: சி# கார்னர் - பிரதிநிதிகள் மற்றும் நிகழ்வுகள்