സമാരംഭിക്കുന്നതിലൂടെ ഫംഗ്ഷനുകളുടെ നിഘണ്ടു പരാജയപ്പെടുന്നത് എന്തുകൊണ്ട്?
നിഘണ്ടുവിനൊപ്പം പ്രവർത്തിക്കുന്നു നിങ്ങൾ ഭയങ്കര cs1950 കംപൈലർ പിശക് , നിങ്ങൾ ഒറ്റയ്ക്കല്ല! ഫംഗ്ഷൻ റഫറൻസുകളുമായി നേരിട്ട് ഒരു നിഘണ്ടു ആരംഭിക്കുമ്പോൾ നിരവധി ഡവലപ്പർമാർ ഈ പ്രശ്നത്തിലേക്ക് ഓടുന്നു. പതനം
ബൂലിയൻ റിട്ടേൺ ചെയ്യുന്ന പ്രവർത്തനങ്ങളെ അനുബന്ധ സന്ദേശങ്ങളുമായി ബന്ധപ്പെടുത്താൻ നിങ്ങൾ ആഗ്രഹിക്കുന്ന ഒരു പ്രോഗ്രാം നിങ്ങൾ പണിയുന്നുവെന്ന് സങ്കൽപ്പിക്കുക. നിങ്ങൾ ഒരു നിഘണ്ടു സൃഷ്ടിക്കുന്നു
ഈ പെരുമാറ്റത്തിന് മനസ്സിലാകുന്നത് എങ്ങനെയുള്ള രീതി ഗ്രൂപ്പ് പരിവർത്തനങ്ങൾ എങ്ങനെ കൈകാര്യം ചെയ്യുന്നുവെന്ന് മനസിലാക്കേണ്ടതുണ്ട് , പ്രത്യേകിച്ച് പ്രവർത്തനം നിയമിക്കുമ്പോൾ. C # കൺസ്ട്രക്റ്റർമാർക്കോ രീതികളോ ഉള്ളിൽ വ്യക്തമായ പരിവർത്തനം അനുവദിക്കുന്നതിനിടയിൽ, അത് സമാരംഭിക്കുന്നവയിൽ ഒരേ പരിവർത്തനവുമായി പൊരുത്തപ്പെടുന്നു . ഇത് തുടക്കക്കാർക്കും പരിചയമുള്ള ഡവലപ്പർമാർക്കും ആശയക്കുഴപ്പമുണ്ടാക്കാം!
ചിത്രീകരിക്കാൻ, രീതി ഗ്രൂപ്പുകൾ തമ്മിൽ എങ്ങനെ വേർതിരിക്കുന്നു , വ്യക്തമായ പ്രതിനിധികൾ എന്നിവയ്ക്കിടയിൽ ചിന്തിക്കാൻ ചിന്തിക്കുക. ഒരു ഷെഫ് എങ്ങനെ പിന്തുടരാനുള്ള വ്യക്തമായ ഒരു പാചകക്കുറിപ്പ് നൽകേണ്ടതുണ്ട് 🍳, സി # കംപൈലറിന് അവ്യക്തത പരിഹരിക്കുന്നതിന് ഒരു വ്യക്തമായ ഫംഗ്ഷൻ ഒപ്പ് ആവശ്യമാണ്. ഈ ഘട്ടത്തെ ഘട്ടം ഘട്ടമായി തകർക്കാം!
ആജ്ഞാപിക്കുക | ഉപയോഗത്തിനുള്ള ഉദാഹരണം |
---|---|
Func<T> | ടി തരം തിരിച്ച് നിഘണ്ടുവിൽ സംഭരിക്കുന്നതിന് ഉപയോഗിക്കുന്ന ഒരു രീതിയെ സ്വാധീനിക്കുന്ന ഒരു പ്രതിനിധിയെ പ്രതിനിധീകരിക്കുന്നു. |
() => MethodName() | ഒരു രീതി അഭ്യർത്ഥിക്കുന്ന ഒരു അജ്ഞാത ലാംഡ എക്സ്പ്രഷൻ സൃഷ്ടിക്കുന്നു. ഇത് നേരിട്ടുള്ള രീതി ഗ്രൂപ്പ് പരിവർത്തനങ്ങളെ തടയുന്നു, അത് കംപൈലർ പിശകുകൾക്ക് കാരണമാകും. |
delegate bool BoolFunc(); | ഫംഗ്ഷൻ ഒപ്പുകളുമായി വ്യക്തമായി പൊരുത്തപ്പെടുന്ന ഒരു ഇഷ്ടാനുസൃത ഡെലിഗേറ്റ് തരം നിർവചിക്കുന്നു, ഇത് അന്തർവ്യവസ്ഥയില്ലാതെ നിഘണ്ടുക്കളിൽ പ്രവർത്തന സംഭരണം അനുവദിക്കുന്നു. |
Dictionary<Func<bool>, string> | ഒരു നിഘണ്ടു റഫറൻസുകൾ കീകളും അനുബന്ധ സ്ട്രിംഗ് മൂല്യങ്ങളും ആയി സംഭരിക്കുന്നു. |
Assert.AreEqual(expected, actual); | ഒരു ഫംഗ്ഷന്റെ റിട്ടേൺ മൂല്യം പ്രതീക്ഷിച്ച ഫലവുമായി പൊരുത്തപ്പെടുന്നുവെന്ന് സ്ഥിരീകരിക്കുന്നതിന് യൂണിറ്റ് പരിശോധനയിൽ ഉപയോഗിക്കുന്നു. |
[SetUp] | ഓരോ പരിശോധനയ്ക്കും മുമ്പായി ഒരു രീതി അടയാളപ്പെടുത്തുന്ന ഒരു കനിറ്റ് ടെസ്റ്റ് ആട്രിബ്യൂട്ട്, ടെസ്റ്റ് ഡിപൻഡൻസികൾ സമാരംഭിക്കുന്നതിന് ഉപയോഗപ്രദമാണ്. |
private static bool MethodName() => true; | ഒരു ബൂളിയൻ മൂല്യം തിരികെ നൽകുന്ന ഒരു കോംപാക്റ്റ് രീതി നിർവചിക്കുന്നു, ഇത് സംഭാഷണ സാധ്യതയുള്ള യുക്തിക്ക് ഉപയോഗപ്രദമാണ്. |
FunctionDictionary[() => TestA()] | നിഘണ്ടുവിൽ നിന്ന് ഒരു മൂല്യം വീണ്ടെടുക്കുന്നതിനുള്ള ശ്രമങ്ങൾ ഒരു കീയായി ഉപയോഗിക്കുന്നതിനുള്ള ശ്രമങ്ങൾ, പരാമർശങ്ങൾ എങ്ങനെയാണ് പ്രവർത്തനക്ഷമമായി പ്രവർത്തിക്കുന്നത് എന്ന് കാണിക്കുന്നു. |
internal class Program | ഒരേ നിയമസഭയിൽ ആക്സസ് ചെയ്യാവുന്നതായി ഒരു ക്ലാസ് അടയാളപ്പെടുത്തുക, പക്ഷേ ബാഹ്യമായി അല്ല, എൻക്നോസ്പോണ്ടേഷൻ നടപ്പിലാക്കുന്നു. |
C # ലെ പ്രവർത്തനങ്ങൾ മനസിലാക്കുക
സി # ഉപയോഗിച്ച് പ്രവർത്തിക്കുമ്പോൾ, നിങ്ങൾ ഒരു നിഘണ്ടു ഉള്ളിൽ പ്രവർത്തനങ്ങൾ സംഭരിക്കേണ്ട സാഹചര്യങ്ങൾ . പ്രവർത്തനങ്ങൾ അവരുടെ പെരുമാറ്റങ്ങൾ ചലനാത്മകമായി മാപ്പുകാർക്ക് ഇത് ഉപയോഗപ്രദമാകും. എന്നിരുന്നാലും, നിങ്ങൾ നിഘണ്ടു രീതി ക്രമീകരിക്കാൻ ശ്രമിക്കുകയാണെങ്കിൽ, രീതി ഗ്രൂപ്പ് പരിവർത്തന പ്രശ്നങ്ങൾ കാരണം കംപൈലർ ഒരു പിശക് എറിയുന്നു. ആദ്യ ഉദാഹരണത്തിൽ, ഒരു ഫീൽഡ് സമാരംഭിക്കുന്നവയിൽ ഫംഗ്ഷനുകൾ ചേർക്കുന്നതാണ്, CS1950 ലേക്ക് നയിക്കുന്നു. ലാംഡ എക്സ്പ്രഷനുകൾ അല്ലെങ്കിൽ വ്യക്തമായ പ്രതിനിധികൾ ഉപയോഗിക്കുക എന്നതാണ് പരിഹാരം. പതനം
കൺസ്ട്രക്റ്റർ ലിവറേജുകളിലെ ആദ്യത്തെ പ്രവർത്തന പരിഹാരം രീതി ഗ്രൂപ്പ് പരിവർത്തനങ്ങൾ അത് രീതി ശരീരത്തിൽ അനുവദനീയമാണ്. c # മുതൽ വ്യക്തമായ പരിവർത്തനങ്ങൾ ഒരു രീതി വ്യാപ്തിയിൽ അധ്വാനിക്കുന്നതിനുള്ള രീതികൾ അനുവദിക്കുന്നു, ഇത് കൺസ്ട്രക്റ്റർ ഇഷ്യുവിഷയങ്ങളില്ലാതെ പ്രവർത്തിക്കുന്നു. കമാൻഡ് പാറ്റേൺ നടപ്പിലാക്കൽ അല്ലെങ്കിൽ ഇറ്റ് ഇവന്റൻ ഓടുന്ന ആർക്കിടെക്ചറുകൾ പോലുള്ള ഡൈനാമിക് ഫംഗ്ഷൻ അസൈൻമെന്റുകൾ ആവശ്യമുള്ള സാഹചര്യങ്ങളിൽ ഈ സമീപനം സാധാരണയായി ഉപയോഗിക്കുന്നു.
ഒരു വ്യക്തമായ ഡെലിഗേറ്റ് തരം ഉപയോഗിക്കുന്നത് മറ്റൊരു പരിഹാരം ഉൾപ്പെടുന്നു. ഫൺസിലേക്ക് ആശ്രയിക്കുന്നതിനുപകരം
കൃത്യത ഉറപ്പാക്കാൻ, ഒരു യൂണിറ്റ് ടെസ്റ്റ് നനിറ്റ് ഉപയോഗിച്ച് ഉൾപ്പെടുത്തിയിട്ടുണ്ട്. ഫംഗ്ഷൻ മാപ്പിംഗുകൾ പ്രതീക്ഷിച്ച സ്ട്രിംഗ് മൂല്യങ്ങൾ തിരികെ നൽകുമെന്ന് സ്ഥിരീകരിക്കാൻ ഇത് ഡവലപ്പർമാരെ അനുവദിക്കുന്നു. പ്രായോഗികമായി, കോൾബാക്ക് ഫംഗ്ഷനുകൾ അല്ലെങ്കിൽ ഡൈനാമിക് വധശിക്ഷകൾ ഒഴുകുമ്പോൾ നിഘണ്ടുനേരി പരിശോധനകൾ അനിവാര്യമാണ്. ഒരു വീഡിയോ ഗെയിം ഇൻപുട്ട് സിസ്റ്റത്തെക്കുറിച്ച് ചിന്തിക്കുക വ്യത്യസ്ത കീ പ്രസ്സുകൾ നിർദ്ദിഷ്ട പ്രവർത്തനങ്ങളെ പ്രവർത്തനക്ഷമമാക്കുന്നു. ഫംഗ്ഷനുകളുടെ നിഘണ്ടു ഉപയോഗിക്കുന്നത് ലോജിക് ക്ലീനറും സ്കേലബിളും ഉണ്ടാക്കുന്നു. പതനം
സി # ൽ ഫംഗ്ഷനുകൾ സംഭരിക്കാൻ നിഘണ്ടുക്കൾ ഉപയോഗിക്കുന്നു
C # ലെ രീതി റഫറൻസുകൾ ഉപയോഗിച്ച് ഒരു ഫംഗ്ഷൻ-സംഭരണ നിഘണ്ടു നടപ്പിലാക്കുക.
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;
}
}
പരിഹാരങ്ങൾ സാധൂകരിക്കാനുള്ള യൂണിറ്റ് ടെസ്റ്റ്
ഫംഗ്ഷൻ നിഘണ്ടുവിന്റെ കൃത്യത ഉറപ്പാക്കാൻ ന്യൂനിറ്റ് ഉപയോഗിച്ച് യൂണിറ്റ് പരിശോധന.
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;
}
}
അവസാനിക്കുന്ന ഫംഗ്ഷൻ നിഘണ്ടു നമ്പരകൾ സി # ലെ പ്രശ്നങ്ങൾ
A # ൽ പ്രവർത്തിക്കുമ്പോൾ പരിഗണിക്കേണ്ട മറ്റൊരു പ്രധാന കാര്യം അജ്ഞാത രീതികൾ , ലാംഡ എക്സ്പ്രഷനുകൾ എന്നിവ എങ്ങനെ പ്രവർത്തിക്കുന്നു എന്നതാണ്. ഒരു രീതിയുടെ പേര് നേരിട്ട് ഉപയോഗിക്കുമ്പോൾ, വ്യക്തമായ പരിവർത്തനങ്ങളുമായി കംപൈലർ പോരാടുന്നു. എന്നിരുന്നാലും, ഫംഗ്ഷൻ ഒരു ലാംഡ എക്സ്പ്രഷൻ ഉള്ളിൽ () => TestA(), രീതി റഫറൻസ് ശരിയായി വ്യാഖ്യാനിക്കുന്നത് ഉറപ്പാക്കുന്നു. ഈ സാങ്കേതികത സാധാരണയായി ഇവന്റൻ ഡ്രൈവ് പ്രോഗ്രാമിംഗിൽ സാധാരണയായി ഉപയോഗിക്കുന്നു , കോൾബാക്ക് ഫംഗ്ഷനുകൾ സൂക്ഷിക്കുകയും ചലനാത്മകമായി നടത്തുകയും വേണം.
പ്രവർത്തന സംഭരണം കൂടുതൽ ശക്തമാക്കുന്നതിന് ഡെലിഗേറ്റ് തരങ്ങൾ സ്വാഭാവികമാണ് മികച്ച പരിശീലനം. * ഫങ്ക്
അവസാനമായി, സംഭരിച്ച പ്രവർത്തനങ്ങൾ നിലനിർത്തുന്നതിന് ഇത് നിർണായകമാണ് സംസ്ഥാന സമഗ്രത . ഒരു ഫംഗ്ഷൻ ബാഹ്യ വേരിയബിളുകളെയോ ക്ലാസ് അംഗങ്ങളെ ആശ്രയിച്ചാൽ, നിയുക്തമാക്കുമ്പോൾ അവ ശരിയായി പിടിക്കപ്പെടുമെന്ന് ഉറപ്പാക്കുക. മൾട്ടി-ത്രെഡുചെയ്ത അപ്ലിക്കേഷനുകളിൽ , അനുചിതമായ പ്രവർത്തനം റഫറൻസുകൾ റേസ് അവസ്ഥയിലേക്ക് നയിച്ചേക്കാം. ത്രെഡ്ലോക്കൽ സ്റ്റോറേജ് അല്ലെങ്കിൽ മാറ്റമില്ലാത്ത ഫംഗ്ഷൻ പാരാമീറ്ററുകൾ ഈ പ്രശ്നങ്ങൾ തടയാൻ സഹായിക്കും. ഒരു ടാസ്ക് ഷെഡ്യൂളർ സങ്കൽപ്പിക്കുക വ്യവസ്ഥകളെ അടിസ്ഥാനമാക്കിയുള്ള പ്രവർത്തനങ്ങൾ ചലനാത്മകമായി നൽകുന്നത്-ശരിയായ പ്രവർത്തന സംഭരണം സുഗമമാണ്. പതനം
സി # നിഘണ്ടുക്കളിൽ പ്രവർത്തനങ്ങൾ സംഭരിക്കുന്നതിനെക്കുറിച്ചുള്ള സാധാരണ ചോദ്യങ്ങൾ
- എന്തുകൊണ്ടാണ് കംപൈലർ CS1950 പിശക് എറിയപ്പെടുന്നത്?
- കംപൈലർ പരാജയപ്പെടുന്നു, കാരണം ഇത് ഒരു രീതി ഗ്രൂപ്പിനെ വ്യക്തമായി പരിവർത്തനം ചെയ്യാൻ കഴിയില്ല Func<bool> ഒരു ഫീൽഡിൽ സമാരംഭിക്കുന്നയാൾ. പരിവർത്തനം ഒരു കൺസ്ട്രക്റ്റർ പോലുള്ള ഒരു രീതിക്കുള്ളിൽ പ്രവർത്തിക്കുന്നു.
- ഫംഗ്ഷൻ നിഘണ്ടു സമാരംഭിക്കൽ പ്രശ്നങ്ങൾ എങ്ങനെ പരിഹരിക്കാനാകും?
- ഒരു ലാംഡ എക്സ്പ്രഷനുള്ളിലെ ഫംഗ്ഷൻ റഫറൻസ് ലൈക്ക് ചെയ്യുക () => TestA() ശരിയായ പരിവർത്തനം ഉറപ്പാക്കാൻ.
- ഫംഗ്സിനു പകരം ഒരു ഇച്ഛാനുസൃത പ്രതിനിധി ഉപയോഗിക്കുന്നത് നല്ലതാണോ?
- അതെ, ഒരു ഇഷ്ടാനുസൃത പ്രതിനിധിയെപ്പോലെ നിർവചിക്കുന്നു delegate bool BoolFunc(); കോഡ് റീസിയബിലിറ്റി മെച്ചപ്പെടുത്താനും അവ്യക്തത കുറയ്ക്കാനും കഴിയും.
- ഒരു നിഘണ്ടുവിനുള്ളിൽ പാരാമീറ്ററുകളുമായി എനിക്ക് പ്രവർത്തനങ്ങൾ സംഭരിക്കാൻ കഴിയുമോ?
- അതെ, ഉപയോഗിക്കുക Func<T, TResult> പോലുള്ള പാനമേറ്റ പ്രവർത്തനങ്ങൾക്കായി Func<int, bool> ഒരു പൂർണ്ണസംഖ്യ എടുത്ത് ഒരു ബൂലിയൻ തിരികെ നൽകുന്ന പ്രവർത്തനങ്ങൾ സംഭരിക്കുന്നതിന്.
- മൾട്ടി-ത്രെഡ് ചെയ്ത ആപ്ലിക്കേഷനുകളിൽ ഫംഗ്ഷൻ സമഗ്രത ഞാൻ എങ്ങനെ ഉറപ്പാക്കും?
- പോലുള്ള ത്രെഡ്-സേഫ് ടെക്നിക്കുകൾ ഉപയോഗിക്കുക ThreadLocal സംഭരണമോ മാറ്റമില്ലാത്ത ഫംഗ്ഷൻ പാരാമീറ്ററുകൾ റേസ് അവസ്ഥ ഒഴിവാക്കാൻ.
നിഘണ്ടുക്കളിൽ മാസ്റ്ററിംഗ് ഫംഗ്ഷൻ സംഭരണം
ഒരു നിഘണ്ടു ഉള്ളിൽ ഫംഗ്ഷനുകൾ സി 9 ൽ, വ്യക്തമായ പരിവർത്തന നിയമങ്ങൾ കാരണം സി # ൽ തന്ത്രപരമായിരിക്കാം, പക്ഷേ ശരിയായ സാങ്കേതികതകൾ അത് നേടാനാകും. ലാംഡ എക്സ്പ്രഷനുകൾ അല്ലെങ്കിൽ വ്യക്തമായ പ്രതിനിധികൾ , ഡവലപ്പർമാർക്ക് സമാഹരണ പിശകുകൾ മറികടന്ന് വഴക്കമുള്ള പ്രവർത്തനം മാപ്പിംഗുകൾ സൃഷ്ടിക്കാനും കഴിയും. ഒരു അപ്ലിക്കേഷനിൽ റൂട്ടിംഗ് കമാൻഡുകൾ പോലുള്ള ചലനാത്മക പെരുമാറ്റ അസൈൻമെന്റിന് ഈ സമീപനം പ്രയോജനകരമാണ്.
ലളിതമായ ഫംഗ്ഷൻ സംഭരണത്തിനപ്പുറം, മനസിലാക്കുന്ന രീതി റഫറൻസുകൾ സ്കേലബിൾ , കാര്യക്ഷമമായ പരിഹാരങ്ങൾ രൂപകൽപ്പന ചെയ്യാൻ സഹായിക്കുന്നു. കെട്ടിടം സ്റ്റേറ്റ് മെഷീനുകൾ, ഇവന്റ് ഹാൻഡ്ലറുകൾ അല്ലെങ്കിൽ ടാസ്ക് ഷെഡ്യൂൾ ചെയ്യുന്നു , ശരിയായി സമാരംഭിച്ച ഫംഗ്ഷൻ നിഘണ്ടുക്കൾ വിശ്വസനീയമായ നിർവ്വഹണം ഉറപ്പാക്കുന്നു. മികച്ച പരിശീലനങ്ങൾ പ്രയോഗിക്കുന്നതിലൂടെ, ഡവലപ്പർമാർക്ക് കരുത്തുറ്റ, വീണ്ടും ഉപയോഗിക്കാവുന്ന, പരിപാലിക്കുക കോഡ് ഘടനകൾ സൃഷ്ടിക്കാൻ കഴിയും. പതനം
വിശ്വസനീയമായ ഉറവിടങ്ങളും റഫറൻസുകളും
- Microsoft ദ്യോഗിക മൈക്രോസോഫ്റ്റ് ഡോക്യുമെന്റേഷൻ ഓൺ ഫങ്ക് പ്രതിനിധികൾ സി # ലെ അവരുടെ ഉപയോഗം: മൈക്രോസോഫ്റ്റ് ഡോക്സ് - ഫങ്ക് ഡിലിഗെറ്റ്
- വിശദീകരണം രീതി ഗ്രൂപ്പ് പരിവർത്തനങ്ങൾ c # ൽ: മൈക്രോസോഫ്റ്റ് ഡോക്സ് - ലാംഡ എക്സ്പ്രഷനുകൾ
- ഇതിനുള്ള മികച്ച പരിശീലനങ്ങൾ പ്രവർത്തനങ്ങൾ സംഭരിക്കുന്നു ഒരു നിഘണ്ടുവിൽ സാധാരണ പിത്തരസം ഒഴിവാക്കുന്നു: ഓവർഫ്ലോ - ഒരു നിഘണ്ടുവിൽ പ്രവർത്തനങ്ങൾ സംഭരിക്കുന്നു
- പ്രായോഗിക ഉദാഹരണങ്ങളും യഥാർത്ഥ ലോക ഉപയോഗവും പ്രതിനിധികളും ഫംഗ്ഷൻ മാപ്പിംഗുകളും: സി # കോർണർ - പ്രതിനിധികളും ഇവന്റുകളും