Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Tips C# 10

Procedeul de reflection consta in interogarea metadatelor si a codului compilat, la runtime. Aceste informatii sunt folosite in dynamic binding, data binding, serializare, Remoting.
Folosind API-urile oferite de reflection se poate executa in mod dinamic cod dintr-un assembly oarecare. Presupunem ca avem un dll la care nu avem referinta si care contine o clasa pe care dorim sa o instantiem.

    namespace Dynamic
    {
        public class Agent
        {
            public string Name { get; set; }

            public Agent()
            {

            }
        }
    }

    static void Main(string[] args)
    {
        string assemblyName = @"C:\Users\marius\Documents\Visual Studio 2010\Projects\Reflection\Dynamic\bin\Debug\Dynamic.dll";
          
        Assembly assembly = Assembly.LoadFrom(assemblyName);
        if (assembly != null)
        {
            Type type = assembly.GetType("Dynamic.Agent");

            if (type != null)
            {
                dynamic agent = Activator.CreateInstance(type);
                agent.Name = "Marius";
                Console.WriteLine(agent.Name);
            }
        }
    }

Am folosit tipul dynamic din C# 4.0 pentru a apela proprietatea obiectului agent, la runtime. Alte optiuni ar fi fost clasa MethodInfo si apelurile Invoke.

In comparatie cu dynamic binding, care este mai usor de folosit si care se bazeaza pe DLR pentru interoperabilitate, reflection pare mai dificil in utilizare, acesta fiind mai strans legat de CLR.

Tips C# 9

Exista multe moduri de a compara sirurile de caractere in C#. O situatie deosebita apare in cazul compararii string-urilor a caror valoare se schimba in functie de limba in care proiectul este construit. In acest caz, “localized strings”, sirurile de caractere pot parea la fel, dar valoarea bitilor poate fi diferita.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Threading;

namespace StringComparer
{
    class Program
    {
        static void Main(string[] args)
        {
            string s1 = "file";
            string s2 = "FILE";

            bool invariantCultureComparer = string.Compare(s1, s2, true, CultureInfo.InvariantCulture) == 0;
            bool turkishCultureComparer = string.Compare(s1, s2, true, CultureInfo.CreateSpecificCulture("tr-TR")) == 0;

            Console.WriteLine("{0} si {1} sunt egale?", s1, s2);
            Console.WriteLine("---------");
            //da
            Console.WriteLine("Invariant culture:" + (invariantCultureComparer ? "da" : "nu"));
            //nu
            Console.WriteLine("Turkish culture:" + (turkishCultureComparer? "da": "nu"));
           
            Console.ReadLine();
        }
    }
}

Chiar daca vizual reprezentarea sirurilor de caractere este aceeasi, bitii sunt diferiti.

            //11001100110100101101100011001010
            Console.WriteLine(GetBits(s1));
            //10001100100100101001100010001010
            Console.WriteLine(GetBits(s2));

        public static string GetBits(string input)
        {
            StringBuilder sb = new StringBuilder();
            foreach (byte b in Encoding.Unicode.GetBytes(input))
            {
                sb.Append(Convert.ToString(b, 2));
            }
            return sb.ToString();
        }

Se poate observa cat de important este sa tinem cont de “culture” atunci cand comparam sirurile de caractere.

Numar suma de patrate perfecte

Se citeşte de la tastatură un număr natural. Sa se decida dacă acesta poate fi scris ca şi suma de două patrate şi sa se afişeze toate soluţiile găsite.

Problema propusa si rezolvata de robert

Analiza Programului
Se verifica toate perechile de numere mai a caror suma este numarul dat daca sunt patrate perfecte.

Solutia, neoptinizata, primita de la un cititor (robert), caruia ii multumesc pentru implicare, este:

#include
#include
using namespace std;
bool verif_nr(float nr)
{
    bool patrat=false;
    if ((sqrt(nr) * sqrt(nr)) == nr)
        patrat=true;
    return patrat;
}
int main()
{
    float nr, nr1, nr2=0;
    cout<>nr;
    for(nr1=2; nr1<=nr/2; nr1++)
    {
        if(verif_nr(nr1))
        {
            nr2=nr-nr1;
            if(verif_nr(nr2))
                cout<<nr<<"="<<sqrt(nr1)<<"^2"<<" + "<<sqrt(nr2)<<"^2"<<endl;
        }
    }
    return 0;
}

Un voluntar pentru o solutie in c#??

Exercitiu

Se citeste de la tastatura o succesiune de litere mic terminata cu caracterul punct.Sa se afiseze pe ecran literele care se repeta.

Analiza Programului
O prima solutie ar fi memorarea caracterelor intr-un vector, parcurgerea lui pentru fiecare element si verificarea daca mai apare sau nu pe o alta pozitie. Daca da, il afisam. Aceasta varianta nu este foarte potrivita, deoarece caracterul va fi afisat ori de cate ori va fi gasit pe o alta pozitie. Asta inseamna ca va trebui sa stim daca un caracter a mai fost sau nu afisat. Pentru asta, vom declara un vector cu 26 de componente (numarul de litere mici din alfabet). Chiar de la citirea caracterelor, vom numara in acest vector ori de cate ori va aparea fiecare litera din alfabet in sir. Vom parcurge vectorul si vom afisa doar literele pentru care numarul de aparitii va fi mai mare decat 1.

Rezolvarea in C#

Video tutorial android – comunicarea intre ferestre

Pana acum am folosit in exemplele din aceasta serie – care e la inceput – numai o singura fereastra sau 2 ferestre distincte, care nu prea comunica intre ele. E cam inutil sa ai o aplicatie a caror ferestre nu comunica.
In acest episod, care e format din 6 filmulete, intinse, insumat, pe o perioada de cam o ora si jumatate, vom construi o prima aplicatie functionala, care face ceva. In acest episod voi arata cum se construiesc 2 frestre (Activity), cum se navigheaza intre ele, cum se transfera un obiect intre ele si cum se creaza dinamic controale (views). Urmeaza ca in episodul urmator sa completez aplicatia si sa salvez/incarc datele introduse.
Aplicatia pe care o voi crea se numeste “Friends Book”, un fel de agenda telefonica. Nu m-am gandit cat de mult voi dezvolta aceasta aplicatie fara importanta practica, insa o voi folosi cateva episoade – e mai usor de invatat pe o aplicatie concreta (chiar daca inutila) decat din exemple distincte, fara legautra intre ele, si fara un scop precizat.
Asa cum spuneam, aplicatia are 2 ferestre:
1. Fereastra principala (MAIN), in care putem vedea lista prietenilor introdusi, si in care putem sa facem managementul acestora si
2. Fereastra unde vom adauga sau edita un prieten din lista noastra.

Continue reading

Tips C# 8

In lucrul cu sirurile de caractere, de regula trebuie acordata atentie:

  • Daca string-ul este null
  • Daca string-ul este gol
  • Daca string-ul contine spatii

Primele doua conditii se pot verifica folosind metoda String.IsNullOrEmpty().

In .NET 4.0 a aparut si metoda String.IsNullOrWhiteSpace() cu ajutorul careia se poate verifica daca sirul contine doar spatii.

using System;

namespace String
{
    class Program
    {
        static void Main(string[] args)
        {
            string s1 = null;
            string s2 = "";
            string s3 = "  ";
            
            //true
            Console.WriteLine(string.IsNullOrEmpty(s1));
            //true
            Console.WriteLine(string.IsNullOrEmpty(s2));
            //true
            Console.WriteLine(string.IsNullOrWhiteSpace(s3));

            Console.ReadLine();
        }
    }
}

Tips C# 7

Am intalnit situatia in care am fost nevoit sa generez campuri a caror valoare sa fie unica. Solutia mi-a fost oferita de structura Guid care va genera valori cu marimea de 128 biti. Probabilitatea ca acestea sa fie unice pentru toate calculatoarele, in toate retele, este foarte mare.

using System;

namespace GUIDExample
{
    class Program
    {
        static void Main(string[] args)
        {
            //F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4

            Console.WriteLine(Guid.NewGuid());
        }
    }
}

GUID este folosit in lucrul cu bazele de date si de sistemele de operare pentru a identifica in mod unic inregistrari, respectiv diferite componente.
Valorile GUID sunt generate printr-o combinatie formata din informatiile hardware si timp.

Intents: navigarea intre ferestre (Activities)

In acest episod voi introduce un nou concept: Intent. Intent este o metoda de a lega mai multe ferestre intre ele. ferestrele nu trebuie sa apartina in mod necesar aceleasi aplicatii, de exemplu pot apela in aplicatia mea fereastra de dialer a telefonului la fel cum pot apela orice fereastra a aplicatiei mele!
Un Intent se foloseste, de obicei, ca parametru al metodei startActivity() a clasei Activity. In momentul in care o noua fereastra apare, fereastra care a deschis-o, cea unde am executat startActivity, nu este distrusa, ci plasata intr-o stiva si se poate reveni la ea prin apasarea butonului back.

Continue reading