Posts

Showing posts from 2007

Path.Combine - C# 3.0 Extension Method

O data cu C# 3.0 au venit si metodele extensie. Sunt foarte utile cand se vrea a se extinde o clasa care nu poate fi mostenita cum e clasa string.
Un alt avantaj e ca schimba notatia prefix a metodelor statice cu una infix, ceea ce face codul mult mai clar si mai usor de scris. De exemplu metoda statica Combine din clasa Path concateneaza doua stringuri pentru a obtine o cale fizica valida. Pentru doua stringuri e OK, dar atunci cand se combina mai mult de doua stringuri deja incepi sa numeri paranteze.

public static class PathExtension
{
public static string Combine(this string instance, string path2)
{
return Path.Combine(instance, path2);
}
}
class Program
{
static void Main(string[] args)
{
string root = "C:\\";
string mainFolder = "Files";
string subFolder = "Backup";
string fileName = "today.xml";

// notatie prefix
Console.WriteLine(
Path.Combine(
Path.Combine(
Path.Combine(root, mainFolder),subFolder),fileName));

// notatie infix

Injectare cod javascript

Image
Sunt unele situri care pur si simplu te lasa sa iti formatezi textul scris de tine . De exemplu un blog iti ofera tool-uri cu care sa inserezi diverse elemente html sau il formatezi de mana. In felul acesta iti customizezi ceea ce pui pe net. Mai sunt si situri pe care poti edita html-ul, dar nu poti insera taguri <script><script/>. Le "elimina". Vrei uneori sa te bucuri si de functionalitatile unui limbaj client ca JavaScript, pentru care codul se afla undeva la un URL. Adaugi o referinta la el <head> <script language="JavaScript" src="URL"></script> </head> eJobs e un site pe care iti faci un CV, il mai aranjezi un pic cu niste formatari. E ok. Se stie ca un CV stufos nu arata prea bine. Dar parca ai vrea sa pui si aia si aia.. si ca ai facut aia la firma X .. orice, si se aduna si te bate gandul sa gasesti o modalitate prin care sa le arati, dar doar la cerere. Asadar, iti faci un div.. …

WCF: creare serviciu, configurare, gazduire pe serverul IIS, creare client

Voi prezenta cum se poate crea un serviciu Windows Communication Foundation (Indigo), pornind de la crearea unei solutii care sa continta, serviciul in sine, o librarie de creare de obiecte business, precum si directorul virtual care va gazdui serviciul in IIS.
Pentru a folosi acestea e nevoie de .Net 3.0. Mai multe despre cum se instaleaza aici


Pregatirea solutiei: Visual Studio 2005

se creaza o solutie de tip librarie, numita IndigoService
in solutie se adauga o doua librarii numite BusinessLogic si BusinessObjects
in directorul radacina al solutiei se creaza un director IISHosting si in acest director un alt director bin
in solutie se adauga un proiect de tip ConsoleApplication numit ServiceClient



Adaugarea claselor
in libraria BusinessObjects

se adauga referinta la System.Runtime.Serialization
se creaza clasa Customer

Customer.cs

using System.Runtime.Serialization;

namespace BusinessObjects
{
[DataContract]
public class Customer
{
[DataMember]public i…

xml 2 html sau formatarea unui raspuns web service

Si-am dat de o problema: namespace-urile.

In incercarea disperata de a transforma cu un xslt raspunsul unui web service si dupa vreo ora de rateuri am realizat ca de fapt namespace-ul definit pentru web service era vinovatul.

Si un mic exemplu:
Raspunsul web service-ului

<?xml version="1.0" encoding="utf-8"?>

<?xml-stylesheet type="text/xsl" href="customer.xsl" ?>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetCustomerResponse xmlns="http://www.company.com/webservice/">

<Customer>
<Address>
<Street>Pictor Grigorescu</Street>
<StreetNo>2</StreetNo>
</Address>
</Customer>

</GetCustomerResponse>
</soap:Body>
</soap:Envelope>


Acu si xslu

<?xml version="1.0" encoding="ISO-8859-1&q…

XOR?

using System;
using System.Text;

// Am vazut un mod criptare a parolelor intr-o baza de date bazat pe operatia XOR
//
// Ideea e urmatoarea:
// La inregistrare parola userului este codificata printr-o operatie XOR
// intre parola si o cheie, iar codificarea este pastrata in baza de date.
//
// Cand utilizatorul se autentifica, trimite parola, se face codificarea si apoi
// se compara cu cea de la inregistrare. Daca e ok inseamna ca e logat.. logic.
//
// Astfel se vrea ca absolut nimeni sa nu stie parolele (nu conteaza ca e dezvoltator SQL..)
//
// Un exemplu:
// parola : *********
// cheia publica : sharedkeys
// se face XOR caracter cu caracter intre parola si cheia publica
// ********* ^ sharedkeys = codificarea (o secventa de carcatere ASCII)
//
// Daca se stiu cheia publica si codificarea se p…

yield keyword

using System;
using System.Collections;
using System.Collections.Generic;


namespace YieldDemo
{
public static class YieldDemo
{
///
/// Filtrarea unui sir de stringuri cu yield
///
///
///
public static IEnumerable NamesWitchStartsWithALetter(string[] names)
{
foreach ( string name in names )
if ( name.StartsWith ( "A" ) )
yield return name;
}

///
/// crearea unui iterator pentru un numar limitat de patrate perfect
///
///
///
public static IEnumerable<int> Squares(int squaresCount)
{
int sqCounter = 1;
while (sqCounter <= squaresCount)
{
yield return sqCounter * sqCounter;
sqCounter++;
}
}
/// <summary>
/// iterator pentru primele n numere din sirul Fibonacci
/// </summary>
/// <param name="f…

Operatorii is si as

Costul operatorilor as is is
static void Main(string[] args)
{
object obj = new string('s', 1);
IsDemo(obj);
AsDemo(obj);
ExplicitDemo(obj);
} static void IsDemo(object str)
{
string local = null;

if (str is string)
{
local = (string)str;
}
}

.method private hidebysig static void IsDemo(object str) cil managed
{
// Code size 29 (0x1d)
.maxstack 2
.locals init ([0] string local,
[1] bool CS$4$0000)
IL_0000: nop
IL_0001: ldnull
IL_0002: stloc.0
IL_0003: ldarg.0

-- parametrul este incarcat si se testeaze daca este de tip System.String

IL_0004: isinst [mscorlib]System.String
IL_0009: ldnull

-- se incarca pe stiva rezultatul operatiei IL_0004 > IL_0009 (in acest caz e 1)

IL_000a: cgt.un
IL_000c: ldc.i4.0
IL_000d: ceq

-- se calculeaza IL_000a == IL_000a (adica 1 == 0) si se pastreaza rezultatul in loc.1

IL_000f: stloc.1
IL_0010: ldloc.1

-- daca este adevarat (1 == 0) se sare la instru…

Orice este un obiect

using System;

namespace Namespace
{
public interface IObject
{
void MyToString();
}
public class MyObject : IObject
{
public void MyToString(){}
}
public class Program
{
static void SomeFunction(object a, object b, IObject c, MyObject d)
{
Int32 i = (int)a;
MyObject obj_b = b as MyObject;
MyObject obj_bb = (MyObject)b;
IObject iobj_b = (IObject)b;

MyObject obj_c = (MyObject)c;
MyObject obj_cc = c as MyObject;

IObject iobj_d = d as MyObject;
IObject iobj_dd = d;
IObject iobj_ddd = (MyObject)d;
}
static void Main(string[] args)
{
Int32 i = 3;
MyObject myobj = new MyObject();

SomeFunction(i, myobj, myobj, myobj);

Hello World

Sunt Adrian Iftode, programator .Net, cel putin asta fac 8 ore la serviciu. Acest blog va contine lucruri simple legate de programare cu limbajul C#.