Hittade en något osmart funktion i MSs AccessMembershipProvider paket - SecUtility:
internal static bool ValidateParameter(ref string param,
//this is a very strange check, since if it IS null,
//all other checks are useless, commas will not be present
//in a parameter == null, nor will it have a size or length (i.e. empty check)
//hence: it must check for null no matter what, so why provide a boolean parameter of it???
bool checkForNull,
bool checkIfEmpty, bool checkForCommas, int maxSize)
{
if (param == null)
{
if (checkForNull)
{
return false;
}
return true;
}
param = param.Trim();
if ((checkIfEmpty && param.Length < 1) ||
(maxSize > 0 && param.Length > maxSize) ||
(checkForCommas && param.IndexOf(",") != -1))
{
return false;
}
return true;
}
Tycker faktiskt inte att det är en så osmart funktion ändå. För att din parameter kan faktiskt vara valid fast den är NULL, det bestämmer du som utvecklare. Alltså en NULL parameter skall inte genererar ett False från funktionen och det klara denna av.
Nu har jag svårt att se något tillfälle när jag skulle ha nytta av en valid NULL parameter, men nu finns möjligheten till det.
Tycker faktiskt inte att det är en så osmart funktion ändå. För att din parameter kan faktiskt vara valid fast den är NULL, det bestämmer du som utvecklare. Alltså en NULL parameter skall inte genererar ett False från funktionen och det klara denna av.
Nu har jag svårt att se något tillfälle när jag skulle ha nytta av en valid NULL parameter, men nu finns möjligheten till det.
- M
Men måste man inte deklarera variabeln som nullable för att den ska kunna vara null?
Jag bara menar, att om den får lov att vara null, så måste man logiskt sett godta att den har s.Length == 0, samt s.IndexOf(",") >= 0. Alltså behöver man inte ha med checkForNull, eftersom den är null kommer den alltid att validera negativt.
Dessutom, om ni kollar noga på funktionen, så står det "ref string param", och om ref-ordet står det:
MSDN2 skrev:
An argument passed to a ref parameter must first be initialized. This differs from out, whose argument need not be explicitly initialized before being passed. (See out.)
Vilket betyder att kompilatorn inte kan kompilera koden om inte strängen är initierad, dvs något annat än null. Återigen tycker jag det är konstigt att de skulle kolla för null, eftersom ref-ordet gör det omöjligt att skicka med en null-parameter till funktionen, till skillnad från out-ordet som hade gjort det.
Vilket betyder att kompilatorn inte kan kompilera koden om inte strängen är initierad, dvs något annat än null. Återigen tycker jag det är konstigt att de skulle kolla för null, eftersom ref-ordet gör det omöjligt att skicka med en null-parameter till funktionen, till skillnad från out-ordet som hade gjort det.
Du kan initiera en sträng till null således kommer du kunna anropa metoden med en parameter som är null.
Jag bara menar, att om den får lov att vara null, så måste man logiskt sett godta att den har s.Length == 0, samt s.IndexOf(",") >= 0. Alltså behöver man inte ha med checkForNull, eftersom den är null kommer den alltid att validera negativt.
Problemet är att den inte alltid får vara null, det bestämmer ju du utifrån.
if (param == null)
{
if (checkForNull)
{
return false;
}
return true;
}
Alltså om du skickar in en string som är null, så kan du antingen få tillbaka False (om du inte accepterar null som parameter) eller så får du tillbaka True (om du accepterar null som parameter). Så du måste ha med testen.
Då måste ju kontrollera om parameter är null eftersom du inte kan anropa methoder på ett null object. Och om du då får att parameter är null, hur skall du veta om det är valit värde eller ej, ju det gör du genom att kontrollera om null är tilllåtet eller ej. Tänk på att du kommer inte längre i koden om värdet är null, så du kommer aldrig ner till s.Length == 0 så den valideringen kommer aldrig att ske om parametern är null.
- M
285 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e