Verbatim String Literal di C#


Nge-escape satu-satu tiap karakter spesial kalau ada banyak dan stringnya panjang apalagi multiline itu merepotkan, bisa jadi malah ada yang kelewat (mana nih yang belum ke-escape?). Untungnya di C# ada fitur yang membuat penulisan string diinterpretasikan apa adanya, jadi tidak memperdulikan karakter-karakter khusus yang biasa diawali backslash (\).

Menurut buku Tatang Sutarma, ada dua bentuk penulisan string yang didukung C# yaitu regular (biasa) dan verbatim. Nah bentuk yang kedua inilah yang saya maksudkan, cukup dengan menuliskan karakter @ sebelum tanda kutip pembuka menandakan bahwa kita tidak memperdulikan berbagai macam escape (kecuali untuk karakter tanda kutip yang harus ditulis dalam bentuk double-double-quote seperti ini -> “”).

Sebagai contoh perbandingan, di bawah ini saya memiliki sejumlah baris kode JavaScript dalam bentuk string yang ingin saya assign ke sebuah property bertipe string di C# dengan penulisan regular:

RowSelectionModel1.Listeners.RowSelect.Handler =
    "#{GridPanel1}.selModel.getSelected();" +
    "var baris = Ext.data.Record.create([" +
    "    {name: \"Id\"}," +
    "    {name: \"Path\"}" +
    "]);" +
    "var tambahan = new baris({" +
    "    id: Ext.id()," +
    "    Id: record.data.Id," +
    "    Path: \"~\\App\\XML\\\" + record.data.Nmfile + \".xml\"" +
    "});" +
    "parent.#{GridPanel1}.getStore().add(tambahan);";

Dengan mengubah penulisan stringnya ke bentuk verbatim, selain tidak perlu mengescape karakter-karakter khusus juga kita bisa menggunakan penulisan multiline. Lihat bagaimana penulisan dalam bentuk ini mengimprove readability dari kode di atas:

RowSelectionModel1.Listeners.RowSelect.Handler =
  @"#{GridPanel1}.selModel.getSelected();
    var baris = Ext.data.Record.create([
        {name: ""Id""},
        {name: ""Path""}
    ]);
    var tambahan = new baris({
        id: Ext.id(),
        Id: record.data.Id,
        Path: ""~\App\XML\"" + record.data.Nmfile + "".xml""
    });
    parent.#{GridPanel1}.getStore().add(tambahan);";

Lanjutkan membaca “Verbatim String Literal di C#”

Iklan

Value Type vs Reference Type di C#


Menurut buku Tatang Sutarma, berbagai tipe di C# pada hakikatnya dapat dibagi menjadi beberapa kategori yakni value type, reference type, dan pointer type.

Value type meliputi hal-hal seperti enum, struct, int, float, decimal, char, bool, dll. Sedangkan reference type meliputi seluruh tipe class, interface, delegate, dynamic, object, maupun string. Adapun yang menjadi perbedaan utama dari kedua tipe tersebut adalah pada bagaimana representasi dan perlakuannya di memory.

Representasi dari setiap variabel yang bertipe value di memory adalah berupa nilainya, sedangkan tipe nilai reference di memory direpresentasikan dalam bentuk “reference” dan “object” (yang berisi nilainya).

Setiap assignment dari suatu instance ke instance lain pada value type selalu membuat kopian nilainya ke instance baru, sedangkan assignment pada reference tidak ikut mengkopi objeknya namun hanya membuat kopian referencenya saja sehingga keduanya merujuk pada object yang sama.

Untuk melihat bagaimana perbedaan diantara keduanya dapat memberikan perbedaan di dunia nyata, kita lihat pada program berikut ini:

using System;

namespace Program
{
  public struct Tatang
  {
    public int X;
    public int Y;
  }

  public class Sutarma
  {
    public int X;
    public int Y;
  }

  class Program
  {
    static void Main(string[] args)
    {
      Tatang P1 = new Tatang();
      Tatang P2 = new Tatang();
      P1.X = 1;
      P2 = P1;
      P2.X = 2;
      P2.Y = 2;
      P1.Y = 1;

      Sutarma P3 = new Sutarma();
      Sutarma P4 = new Sutarma();
      P3.X = 3;
      P4 = P3;
      P4.X = 4;
      P4.Y = 4;
      P3.Y = 3;

      Console.WriteLine("Hasil\n============");
      Console.WriteLine("Nilai P1: {0}, {1}", P1.X, P1.Y);
      Console.WriteLine("Nilai P2: {0}, {1}", P2.X, P2.Y);
      Console.WriteLine("Nilai P3: {0}, {1}", P3.X, P3.Y);
      Console.WriteLine("Nilai P4: {0}, {1}", P4.X, P4.Y);
      Console.ReadLine();
    }
  }
}

Tebak berapa saja nilai outputnya? yap betul!

Demikianlah, jadi bisa tahu kenapa begini kenapa begitu ingin ini ingin itu banyak sekali..

Lalu bagaimana dengan tipe pointer? masih menurut buku Tatang Sutarma lagi, pointer type pada memory direpresentasikan tidak berisi nilai dari variabelnya melainkan address (alamat palsu) memory dimana isi dari variabel tersebut berada. Tipe ini hanya mungkin pada konteks blok program yang unsafe (ditandai dengan keyword “unsafe”) dikarenakan langsung mengakses memory tanpa dikelola melalui CLR.

Yah gitu deh.. teuing sih can begitu ngarti saya ge yg penting nulis dulu hehe 😀 special thanks to Tatang Sutarma atas bukunya 😆

Extension Method di C#


Di bahasa pemrograman C# yang konsepnya object oriented ini ada salah satu fitur unik namanya extension method, fitur ini memungkinkan kita membuat method tambahan untuk sebuah class tapi didefinisikan dari luar class tersebut. Manfaat dari fitur ini contohnya jika kita ingin menambahkan method pada sebuah class tapi tidak kita punya source class tersebut untuk direcompile. Namun seiring konsep enkapsulasi pada OOP, method yang dibuat di luar ini tidak bisa memanggil private variable atau method dari class yang diextend karena sifat fitur ini sebagai syntactic sugar sehingga walaupun di kode dipanggilnya seperti method biasa tapi sebenarnya manggil static method dari static class lain dimana ia didefinisikan.

Untuk menggunakannya, tipe class yang mendefinisikannya dan jenis methodnya harus static dengan parameter pertama diawali keyword “this” diikuti nama class yang ingin diextend. Sebagai contoh method di bawah ini saya ingin menambahkan method ToAlay() pada setiap instance dari object string.

namespace StrUtil
{
  using System;

  public static class StrUtil
  {
    public static string ToAlay(this string str)
    {
      return str.Replace("o", "0")
                .Replace("i", "1")
                .Replace("z", "2")
                .Replace("e", "3")
                .Replace("a", "4")
                .Replace("s", "5")
                .Replace("g", "6")
                .Replace("j", "7")
                .Replace("b", "8")
                .Replace("q", "9");
    }
  }
}

Di Visual Studio dengan fitur IntelliSense-nya kita bisa melihat tambahan method baru ini akan selalu muncul pada instance yg classnya diextend (di contoh ini class string).

Disini saya membuat program console yang outputnya adalah hasil string yang sudah di ToAlay()-kan

namespace Program
{
  using System;
  using StrUtil;

  class Program
  {
    static void Main(string[] args)
    {
      string s = "The quick brown fox jumps over the lazy dog";
      string a = s.ToAlay();
      Console.WriteLine(a);
      Console.ReadLine();
    }
  }
}

Apa yang akan terjadi kalau saya tekan F5? ini dia:

Cukup M3n4r1k k4n? h3h3.. yah d3m1k14nl4h m0h0n m44f k4l4u 4d4 y6 54l4h, 1n1 7u64 m451h 83l474r 😛 Lanjutkan membaca “Extension Method di C#”